1. 程式人生 > >自定義View實現手勢監聽

自定義View實現手勢監聽

下面是我自定義的view,主要是實現左右滑動

要實現手勢監聽,首先要實現OnGestureListener介面

其次是例項化一個GestureDetector:mDetector = new GestureDetector(context, this);

如果只是簡單的實現OnGestureListener的方法,是不能實現監聽效果,

我們要將onDown , onScroll的返回值改為true,自定義view的clickable屬性為true。

除此之外,我們要重寫自定義view的onTouchEvent方法,onTouchEvent的返回值改為

mDetector.onTouchEvent(event);

即可。

package com.uwatch.condor.view;



import android.content.Context;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;


import com.uwatch.condor.bll.PedometerBLL;
import com.uwatch.condor.util.DateRange;


public class SportView extends View implements OnGestureListener{
private static String TAG = "SportView";
private static int MSG_SCROLL = 0x123;
private Context mContext;
private DateRange mDateRange;
private OnSportViewListener mOnSportViewListener; 
private GestureDetector mDetector;
private PedometerBLL mPedoBll;
private static int sCurrPos = 0;


private Handler handler = new Handler(){


@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);


}
};


private String[] times = {"00:00","04:00","08:00","12:00","16:00","20:00","24:00"};


public SportView(Context context) {
super(context);
init(context);
}


public SportView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}


public SportView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}


private void init(Context context) {
this.mContext = context;
mDetector = new GestureDetector(context, this);

}


public void setDateRange(DateRange dt){
this.mDateRange = dt;
invalidate();
}


public void setOnSportViewListener(OnSportViewListener listener){
this.mOnSportViewListener = listener;
}


public void setPedoBll(PedometerBLL bll){
this.mPedoBll = bll;
invalidate();
}


@Override
protected void onDraw(Canvas canvas) {
if(getWidth()>0 && getHeight()>0){


}
super.onDraw(canvas);
}


public void drawXY(){


}


@Override
public boolean onTouchEvent(MotionEvent event) {
return mDetector.onTouchEvent(event);

}


@Override
public boolean onDown(MotionEvent e) {
Log.e(TAG,"onDown");
return true;
}


@Override
public void onShowPress(MotionEvent e) {
Log.e(TAG,"onShowPress");
}


@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.e(TAG,"onSingleTapUp");
return false;
}


@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
Log.e(TAG,"onScroll");
return true;
}


@Override
public void onLongPress(MotionEvent e) {
Log.e(TAG,"onLongPress");
}


@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.e(TAG,"onFling");
if(e1.getX()<e2.getX()){
startScroll(1);
}else if(e1.getX()>e2.getX()){
startScroll(-1);
}
return false;
}


public void startScroll(int direction){
sCurrPos = sCurrPos + direction;
mOnSportViewListener.scrollCompleted(true, mDateRange.GetRangeDate(mDateRange.getCurrDate(), sCurrPos));
if(direction == 1){//right


}else if(direction == -1){///left


}
}


public interface OnSportViewListener{
public void scrollCompleted(boolean completed,String date);
}
}