上一篇文章自定义viewgroup(1)地址:http://www.jb51.net/article/100608.htm
这里直接代码:
package com.example.libingyuan.horizontallistview.ScrollViewGroup;import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.Scroller;/** * 自定义ViewGroup * 在横向布局的基础上,增加啦滚动效果,但是没有边界限制 */public class ScrollViewGroup extends ViewGroup {private Scroller mScroller;private float mLastMotionX = 0;public ScrollViewGroup(Context context) {this(context, null);}public ScrollViewGroup(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ScrollViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}private void init(Context context) {mScroller = new Scroller(context);}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(), mScroller.getCurrY());postInvalidate();}}@Overridepublic 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:invalidate();break;default:break;}return true;}@Overrideprotected 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;}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {int childLeft = 0;int childWidth;int height = getHeight();int childCount = getChildCount();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;}}@Overridepublic LayoutParams generateLayoutParams(AttributeSet attrs) {return new MarginLayoutParams(getContext(), attrs);}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。