上一篇文章《自定义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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)