Android自定义ViewGroup实现受边界限制的滚动 *** 作(3)

Android自定义ViewGroup实现受边界限制的滚动 *** 作(3),第1张

概述上一篇文章《自定义viewgroup(2)》地址:http://www.jb51.net/article/100610.htm代码packagecom.example.libingyuan.horizontallistview.ScrollViewGroup;

上一篇文章《自定义viewgroup(2)》地址:http://www.jb51.net/article/100610.htm

代码

package com.example.libingyuan.horizontallistvIEw.ScrollVIEwGroup;import androID.content.Context;import androID.util.AttributeSet;import androID.util.displayMetrics;import androID.vIEw.MotionEvent;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.vIEw.WindowManager;import androID.Widget.Scroller;/** * 自定义viewGroup * 在滚动的基础上,增加了边界限制 */public class ScrollVIEwGroup extends VIEwGroup { //滚动计算辅助类 private Scroller mScroller; //手指落点的X坐标 private float mLastMotionX = 0; //屏幕宽度 private int screenWIDth; /**  * 使用new关键字创建对象的时候调用  * @param context 上下文  */ public ScrollVIEwGroup(Context context) {  this(context,null); } /**  * 在XML文件中使用的时候调用  * @param context 上下文  * @param attrs 属性:如 androID:layout_wIDth="wrap_content"  */ public ScrollVIEwGroup(Context context,AttributeSet attrs) {  this(context,attrs,0); } /**  * 在xml文件中调用,并且使用了自定义属性的时候调用  * @param context 上下文  * @param attrs 属性:如 androID:layout_wIDth="wrap_content"  * @param defStyleAttr 自定义属性的ID  */ public ScrollVIEwGroup(Context context,AttributeSet attrs,int defStyleAttr) {  super(context,defStyleAttr);  init(context); } /**  * 初始化方法  * 初始化滚动辅助类Scroller以及计算出屏幕宽度  * @param context  */ private voID init(Context context) {  mScroller = new Scroller(context);  WindowManager manager = (WindowManager) context    .getSystemService(Context.WINDOW_SERVICE);  displayMetrics outMetrics = new displayMetrics();  manager.getDefaultdisplay().getMetrics(outMetrics);  screenWIDth = outMetrics.wIDthPixels; } /**  * 滚动时需要重写的方法,用于控制滚动  */ @OverrIDe public voID computeScroll() {  //判断滚动时候停止  if (mScroller.computeScrollOffset()) {   //滚动到指定的位置   scrollTo(mScroller.getCurrX(),mScroller.getCurrY());   //这句话必须写,否则不能实时刷新   postInvalIDate();  } } /**  * 手指触屏事件监听  * @param event  * @return  */ @OverrIDe public boolean ontouchEvent(MotionEvent event) {  // Todo auto-generated method stub  int action = event.getAction();  float x = event.getX();  switch (action) {   case MotionEvent.ACTION_DOWN:    if (!mScroller.isFinished()) {     mScroller.abortAnimation();    }    mLastMotionX = event.getX();    break;   case MotionEvent.ACTION_MOVE:    float delt = mLastMotionX - x;    mLastMotionX = x;    scrollBy((int) delt,0);    break;   case MotionEvent.ACTION_UP:    VIEw lastChild=getChildAt(getChildCount()-1);    int finalyChild= (int) (lastChild.getX()+lastChild.getWIDth()-screenWIDth);    if (getScrollX()<0){     scrollTo(0,0);    }    if (getScrollX()>=finalyChild)     scrollTo(finalyChild,0);    invalIDate();    break;   default:    break;  }  return true; } @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {  //重新设置宽高  this.setMeasuredDimension(measureWIDth(wIDthMeasureSpec,heightmeasureSpec),measureHeight(wIDthMeasureSpec,heightmeasureSpec)); }  /**  * 测量宽度  */ private int measureWIDth(int wIDthMeasureSpec,int heightmeasureSpec) {  // 宽度  int sizeWIDth = MeasureSpec.getSize(wIDthMeasureSpec);  int modeWIDth = MeasureSpec.getMode(wIDthMeasureSpec);  //父控件的宽(wrap_content)  int wIDth = 0;  int childCount = getChildCount();  //重新测量子vIEw的宽度,以及最大高度  for (int i = 0; i < childCount; i++) {   VIEw child = getChildAt(i);   measureChild(child,wIDthMeasureSpec,heightmeasureSpec);   marginLayoutParams lp = (marginLayoutParams) child.getLayoutParams();   int chilDWIDth = child.getMeasureDWIDth() + lp.leftmargin + lp.rightmargin;   wIDth += chilDWIDth;  }  return modeWIDth == MeasureSpec.EXACTLY ? sizeWIDth : wIDth; } /**  * 测量高度  */ private int measureHeight(int wIDthMeasureSpec,int heightmeasureSpec) {  //高度  int sizeHeight = MeasureSpec.getSize(heightmeasureSpec);  int modeHeight = MeasureSpec.getMode(heightmeasureSpec);  //父控件的高(wrap_content)  int height = 0;  int childCount = getChildCount();  //重新测量子vIEw的宽度,以及最大高度  for (int i = 0; i < childCount; i++) {   VIEw child = getChildAt(i);   measureChild(child,heightmeasureSpec);   marginLayoutParams lp = (marginLayoutParams) child.getLayoutParams();   int childHeight = child.getMeasuredHeight() + lp.topmargin + lp.bottommargin;   height += childHeight;  }  height = height / childCount;  return modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height; } /**  * 给子布局设定位置  */ @OverrIDe protected voID onLayout(boolean changed,int l,int t,int r,int b) {  int childleft = 0;//子VIEw左边的间距  int chilDWIDth;//子VIEw的宽度  int height = getHeight();//屏幕的宽度  int childCount = getChildCount();//子VIEw的数量  for (int i = 0; i < childCount; i++) {   VIEw child = getChildAt(i);   marginLayoutParams lp = (marginLayoutParams) child.getLayoutParams();   chilDWIDth = child.getMeasureDWIDth() + lp.leftmargin + lp.rightmargin;   child.layout(childleft,childleft + chilDWIDth,height);   childleft += chilDWIDth;  } } @OverrIDe public LayoutParams generateLayoutParams(AttributeSet attrs) {  return new marginLayoutParams(getContext(),attrs); }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android自定义ViewGroup实现受边界限制的滚动 *** 作(3)全部内容,希望文章能够帮你解决Android自定义ViewGroup实现受边界限制的滚动 *** 作(3)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存