上一篇文章《自定义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, attrs, 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 stubint 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, widthMeasureSpec, 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, 0, childLeft + childWidth, height); childLeft += childWidth;} } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) {return new MarginLayoutParams(getContext(), attrs); }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。