package com.sandro.layout; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.GestureDetector.OnGestureListener; import android.widget.LinearLayout; import com.sandro.ImageTrans.R; import com.sandro.util.LogUtil; public class MoveLinearLayout extends LinearLayout implements OnGestureListener { private GestureDetector mGestureDetector; private int mMaxDistance = 0; private int mScrollX; private boolean mIsScroll = false; private boolean mIsScrolling = false; public static final int SCROLL_POS_TIME = 300; public static final byte SCROLL_POS_DURATION = 30; public MoveLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector = new GestureDetector(this); setLongClickable(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { LogUtil.i("MoveLinearLayout", "[onMeasure] start"); super.onMeasure(widthMeasureSpec, heightMeasureSpec); int count = getChildCount(); boolean sub2 = false, sub3 = false; View view; for (int i = 0; i < count; ++i) { view = getChildAt(i); if (view.getId() == R.id.sub_view_1 ) { LogUtil.i("MoveLinearLayout", "[onMeasure] sub_view_1 widthMeasureSpec : " + widthMeasureSpec); } if (view.getId() == R.id.sub_view_2 && !sub2) { LogUtil.i("MoveLinearLayout", "[onMeasure] sub_view_2 widthMeasureSpec : " + widthMeasureSpec); view.setLayoutParams(new LayoutParams(widthMeasureSpec, view .getLayoutParams().height)); sub2 = true; } if (view.getId() == R.id.sub_view_3 && sub3 == false) { LogUtil.i("MoveLinearLayout", "[onMeasure] : sub_view_3 widthMeasureSpec : " + widthMeasureSpec); view.setLayoutParams(new LayoutParams(widthMeasureSpec, view .getLayoutParams().height)); sub3 = true; } if (sub2 && sub3) { break; } } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (mMaxDistance == 0) { int distance = 0; int count = getChildCount(); View view; for (int i = 0; i < count; ++i) { view = getChildAt(i); if (view.getId() == R.id.sub_view_2||view.getId() == R.id.sub_view_3) { distance += view.getWidth(); } } mMaxDistance = distance; scrollTo(mMaxDistance, 0); mScrollX = mMaxDistance; // LogUtil.i("MoveLinearLayout", "[onLayout] mScrollX : " + mScrollX); } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } /** * 根据当前的位置判断是否展开或者收起 大于width\2 展开,否则收起 * * @param isUnflod */ public void unFold() { if (!mIsScrolling) { mIsScrolling = true; } } @Override public boolean dispatchTouchEvent(MotionEvent event) { boolean ret = false; if (mIsScroll && event.getAction() == MotionEvent.ACTION_UP) { if (mScrollX > 0 && mScrollX < mMaxDistance) { unFold(); ret = true; } event.setAction(MotionEvent.ACTION_CANCEL); mIsScroll = false; } else if (mGestureDetector != null && mGestureDetector.onTouchEvent(event)) { event.setAction(MotionEvent.ACTION_CANCEL); ret = true; } if (super.dispatchTouchEvent(event)) { ret = true; } if (ret) { invalidate(); } return ret; } @Override public boolean onDown(MotionEvent e) { return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (Math.abs(distanceY) > Math.abs(distanceX)) { return false; } mScrollX += distanceX; LogUtil.i("MoveLinearLayout", "[scrollDis] scrollTo " + mScrollX); scrollDis(); mIsScroll = true; return true; } private void scrollDis() { // if (mScrollX > mMaxDistance) { // mScrollX = mMaxDistance; // // if(mOnFoldFinishListener != null){ // // mOnFoldFinishListener.onFoldFinish(false); // // } // } else if (mScrollX < 0) { // mScrollX = 0; // // if(mOnFoldFinishListener != null){ // // mOnFoldFinishListener.onFoldFinish(true); // // } // } scrollTo(mScrollX, 0); // LogUtil.i("MoveLinearLayout", "[scrollDis] scrollTo " + mScrollX); } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } }