参考网址:http://www.cppcns.com/ruanjian/android/164922.html
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
public class MyView extends View {
private Paint mPaint = new Paint();
private boolean mNotDestroy = true;
private int mCount = 0;
private MyThread myThread;
Bitmap bitmap;
// attrs
private String mText;
private boolean mStartChange;
Context mContext;
public MyView(Context context) {
super(context);
init();
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
// mText = ta.getString(R.styleable.MyView_text);
// mStartChange = ta.getBoolean(R.styleable.MyView_startChange, false);
// ta.recycle();
init();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setTextSize(50);
canvas.drawText(mText + mCount++, 20f, 100f, mPaint);
canvas.save();
canvas.rotate(60, getWidth() / 2, getHeight() / 2);
canvas.drawBitmap(bitmap, 20f, 50f, mPaint);
canvas.restore();
if (null == myThread) {
myThread = new MyThread();
myThread.start();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mNotDestroy = true;
}
@Override
protected void onDetachedFromWindow() {
mNotDestroy = false;
super.onDetachedFromWindow();
}
// 统计500ms内的点击次数
TouchEventCountThread mInTouchEventCount = new TouchEventCountThread();
// 根据TouchEventCountThread统计到的点击次数, perform单击还是双击事件
TouchEventHandler mTouchEventHandler = new TouchEventHandler();
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (0 == mInTouchEventCount.touchCount) // 第一次按下时,开始统计
postDelayed(mInTouchEventCount, 500);
break;
case MotionEvent.ACTION_UP:
// 一次点击事件要有按下和抬起, 有抬起必有按下, 所以只需要在ACTION_UP中处理
mInTouchEventCount.touchCount++;
// 如果是长按操作, 则Handler的消息,不能将touchCount置0, 需要特殊处理
if(mInTouchEventCount.isLongClick) {
mInTouchEventCount.touchCount = 0;
mInTouchEventCount.isLongClick = false;
}
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
return super.onTouchEvent(event);
}
public class TouchEventCountThread implements Runnable {
public int touchCount = 0;
public boolean isLongClick = false;
@Override
public void run() {
Message msg = new Message();
if(0 == touchCount){ // long click
isLongClick = true;
} else {
msg.arg1 = touchCount;
mTouchEventHandler.sendMessage(msg);
touchCount = 0;
}
}
}
public class TouchEventHandler extends Handler {
@Override
public void handleMessage(Message msg) {
Toast.makeText(mContext, "touch " + msg.arg1 + " time.", Toast.LENGTH_SHORT).show();
}
}
class MyThread extends Thread {
@Override
public void run() {
super.run();
while (mNotDestroy) {
if (mStartChange) {
postInvalidate();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public void init() {
mContext = getContext();
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}
public void setText(String mText) {
this.mText = mText;
}
public void setStartChange(boolean mStartChange) {
this.mStartChange = mStartChange;
}
public boolean getStartChange() {
return this.mStartChange;
}
}