public boolean onTouchEvent(MotionEvent event) { printMotinEvent(event); return true; } void printMotinEvent(MotionEvent ev) { final int historySize = ev.getHistorySize(); final int pointerCount = ev.getPointerCount(); Log.e("history", "history的数量"+historySize); for (int h = 0; h < historySize; h++) { for (int p = 0; p < pointerCount; p++) { Log.e("history", "id:"+ev.getPointerId(p)+ ",2 x:"+ev.getHistoricalX(p, h)+",3 y:"+ev.getHistoricalY(p, h)); } } for (int p = 0; p < pointerCount; p++) { Log.e("now", ev.getEventTime()+"time"); Log.e("now", "1 id:"+ev.getPointerId(p)+",2 x"+ ev.getX(p)+",3 y"+ ev.getY(p)); } }
tv = (TextView) findViewById(R.id.tv); btn = (Button) findViewById(R.id.btn); final ObjectAnimator translationX = ObjectAnimator.ofFloat(tv, "translationX", 0,50); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { translationX.setDuration(300); translationX.start(); } }); translationX.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { Log.e("TAG","start x = "+tv.getX()+",translationX = " + tv.getTranslationX() +",left = "+tv.getLeft()); } @Override public void onAnimationEnd(Animator animation) { Log.e("TAG","end x = "+tv.getX()+",translationX = " + tv.getTranslationX() +",left = "+tv.getLeft()); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } });
LongPressGestureDetector
public class LongPressGestureDetector { private ViewConfiguration _configuration; private int _minDistance ; private int _delay; private Context _context; private OnlongPressListener _listener; private Handler _handler ; private Runnable _longPressRunnable; private float _downX; private float _downY; private long _downTime; public LongPressGestureDetector(Context context, OnlongPressListener listener){ _listener = listener; _context = context; _handler = new Handler(Looper.getMainLooper()); _configuration = ViewConfiguration.get(context); _minDistance = _configuration.getScaledTouchSlop(); _delay = _configuration.getLongPressTimeout(); _longPressRunnable = new LongPressRunnale(); } //这里以单指操作 public boolean onTouch(MotionEvent event){ int actionCode = event.getAction() & MotionEvent.ACTION_MASK; switch (actionCode){ case MotionEvent.ACTION_DOWN: _handler.removeCallbacks(_longPressRunnable); _downX = event.getX(); _downY = event.getY(); _downTime = event.getDownTime(); Log.e("TAG",event.getEventTime()+"downtime"+event.getDownTime()); _handler.postDelayed(_longPressRunnable,_delay); case MotionEvent.ACTION_MOVE: int distanceX = (int) Math.abs(event.getX() - _downX); int distanceY = (int) Math.abs(event.getY() - _downY); if(distanceY > _minDistance || distanceX > _minDistance ){ _handler.removeCallbacks(_longPressRunnable); } break; case MotionEvent.ACTION_UP: if(event.getEventTime() - _downTime < _delay) { _handler.removeCallbacks(_longPressRunnable); } Log.e("TAG",event.getEventTime()+"downtime"+event.getDownTime()); break; } return true; } interface OnlongPressListener{ void onLongPress(); } class LongPressRunnale implements Runnable{ @Override public void run() { Log.e("TAG", "进入到了长按的状态了"); if(_listener != null){ _listener.onLongPress(); } } } }
public class MainActivity extends AppCompatActivity { private LongPressGestureDetector _longPressGestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); _longPressGestureDetector = new LongPressGestureDetector(this,new LongPressGestureDetector.OnlongPressListener(){ @Override public void onLongPress() { Log.e("TAG","开始在主线程更新UI了"); } }); } @Override public boolean onTouchEvent(MotionEvent event) { return _longPressGestureDetector.onTouch(event); } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.rrtoyewx.person.FlingViewGroup android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image1" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image2" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image3" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image4" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image5" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image6" /> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/image7" /> </com.example.rrtoyewx.person.FlingViewGroup> </RelativeLayout>
下面的放上了这个自定义viewgroup的实现
package com.example.rrtoyewx.person; import android.content.Context; import android.graphics.Point; import android.graphics.PointF; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.Scroller; /** * Created by Rrtoyewx on 15/11/4. */ public class FlingViewGroup extends ViewGroup { private VelocityTracker _velocityTracker; private Scroller _scroller; private ViewConfiguration _viewConfiguration; private PointF _prePoint; private PointF _tempPoint; private PointF _curPoint; private Point _distancePoint; private int _touchMinDistance; private int _maxFlingVelocity; private int _minFlingVelocity; public FlingViewGroup(Context context) { super(context); } public FlingViewGroup(Context context, AttributeSet attrs) { super(context, attrs); _scroller = new Scroller(context); _viewConfiguration = ViewConfiguration.get(context); _touchMinDistance = _viewConfiguration.getScaledTouchSlop(); _maxFlingVelocity = _viewConfiguration.getScaledMaximumFlingVelocity(); _minFlingVelocity = _viewConfiguration.getScaledMinimumFlingVelocity(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); child.layout(l + i * (r - l), t, r + i * (r - l), b); } } //这里以单指来分析即pointerIndex = 0; @Override public boolean onTouchEvent(MotionEvent event) { int actionCode = event.getAction() & MotionEvent.ACTION_MASK; if(_velocityTracker == null){ _velocityTracker = VelocityTracker.obtain(); } _velocityTracker.addMovement(event); switch (actionCode) { case MotionEvent.ACTION_DOWN: if (_scroller.isFinished()) { _scroller.abortAnimation(); } _prePoint = new PointF(); _prePoint.x = event.getX(0); _prePoint.y = event.getY(0); break; case MotionEvent.ACTION_MOVE: calculateMovePoint(event); _curPoint = _tempPoint; if (Math.abs(_prePoint.x - _curPoint.x) > _touchMinDistance || (Math.abs(_prePoint.y - _curPoint.y) > _touchMinDistance)) { if (_distancePoint != null) { _distancePoint = null; } _distancePoint = new Point(); _distancePoint.x = (int) (_curPoint.x - _prePoint.x); _distancePoint.y = (int) (_curPoint.y - _prePoint.y); scrollTo(-_distancePoint.x + getScrollX(), -_distancePoint.y + getScrollY()); _prePoint = _curPoint; } break; case MotionEvent.ACTION_UP: int pointId = event.getPointerId(0); final VelocityTracker velocityTracker = _velocityTracker; velocityTracker.computeCurrentVelocity(1000, _maxFlingVelocity); int xVelocity = (int) velocityTracker.getXVelocity(pointId); int yVelocity = (int) velocityTracker.getYVelocity(pointId); Log.e("TAG", "xVelocity : " + xVelocity + ",xVelocitY: " + yVelocity); if(Math.abs(xVelocity)>_minFlingVelocity && Math.abs(yVelocity ) > _minFlingVelocity ){ _scroller.fling(getScrollX(),getScrollY(), -xVelocity, -yVelocity,Integer.MIN_VALUE,Integer.MAX_VALUE,Integer.MIN_VALUE,Integer.MAX_VALUE); awakenScrollBars(_scroller.getDuration()); invalidate(); } case MotionEvent.ACTION_CANCEL: resetState(); break; } return true; } /** * 计算event的具体信息 * @param event */ private void calculateMovePoint(MotionEvent event) { _tempPoint = new PointF(); int historySize = event.getHistorySize(); for (int h = 0; h < historySize; h++) { float historicalX = event.getHistoricalX(0, h); _tempPoint.x += historicalX; float historicalY = event.getHistoricalY(0, h); _tempPoint.y += historicalY; } _tempPoint.x += event.getX(0); _tempPoint.y += event.getY(0); _tempPoint.x /= (historySize + 1); _tempPoint.y /= (historySize + 1); } private void resetState() { if (_velocityTracker != null) { _velocityTracker.clear(); _velocityTracker.recycle(); _velocityTracker = null; } } @Override public void computeScroll() { super.computeScroll(); if (_scroller.computeScrollOffset()) { scrollTo(_scroller.getCurrX(), _scroller.getCurrY()); postInvalidate(); } } }