废话不多说直接上代码。
1.主Activity主要得到屏幕尺寸
package com.text.touchpaint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.ImageView;
public class TouchPaintActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView imageView = (ImageView)findViewById(R.id.iv);
final TouchPaintView touchView = (TouchPaintView)findViewById(R.id.touch_view);
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(dm);
ViewTreeObserver observer = imageView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
touchView.setViewSize(imageView.getWidth(),imageView.getHeight());
touchView.setViewLeft(imageView.getLeft());
touchView.setViewTop(imageView.getTop());
}
});
}
}
2.自定义view试图
package com.text.touchpaint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class TouchPaintView extends View{
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private int lastAngle; //上一次转动的角度(如果超过180度,则角度会变小)
private int lastBigAngel; //上一次转动的角度(如果超度180度,角度不会变小)
private float centerX; //圆心在屏幕中的x轴坐标
private boolean isClockWise = true; //是否是顺时针旋转
private Paint mPaint;
private int left;
private int top;
private int viewWidth;
private int viewHeight;
private int circleCount = 0;
public final String TAG = "touchpaint";
public TouchPaintView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public TouchPaintView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TouchPaintView(Context context) {
super(context);
init();
}
public void setViewLeft(int left){
this.left = left;
}
public void setViewTop(int top){
this.top = top;
}
public void setViewSize(int viewWidth, int viewHeight){
this.viewWidth = viewWidth;
this.viewHeight = viewHeight;
}
public void init(){
mPath = new Path();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0x77FF0000);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(12);
}
public int getAngleByAcos(double acos){
return (int)((360*acos)/(2*Math.PI));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
// Log.d(TAG, "angle cha cha"+(centerToTop - mY));
double params = (centerToTop - mY)/circleR;
double acos = Math.acos(params);
// Log.d(TAG, "acos++++++++++++"+acos);
if(isCenterLocated){
int angle = getAngleByAcos(acos);
Log.d(TAG, "angle++++++++++++"+angle);
Log.d(TAG, "lastBigAngel++++++++++++"+lastBigAngel);
if(angle != 0){
lastAngle = angle;
}else if(angle == 0){//防止角度计算不到为0时
angle = lastAngle;
}
if(mX < centerX){ //超过180度时
angle = 360 - angle;
}
// else{
// circleCountCreate = false;
// }
if(angle - lastBigAngel > 0){
isClockWise = true;
}else if(angle - lastBigAngel < 0){
isClockWise = false;
}else{
}
lastBigAngel = angle;
Log.d(TAG, "isclockwise-----------"+isClockWise);
if(isClockWise){ //如果顺时针滑动并且滑动的角度大于一定数值则认为用户已经滑过一圈
if(angle > 360 - errorValue){
// if(!circleCountCreate){
// circleCountCreate = true;
// }
circleCount = circleCount + 1;
// lastBigAngel = 0;
}
}else{
if(angle < errorValue){
if(circleCount > 0){
circleCount = circleCount - 1;
// lastBigAngel = 0;
}
}
}
Log.d(TAG, "circleCount-----------"+circleCount);
canvas.drawArc(rectF, 270, circleCount*360+angle, false, mPaint);
}
}
private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;
private RectF rectF;
private double centerToTop; //原心距离屏幕顶部的距离
private boolean isCenterLocated = false; //圆心是否确定
private int circleR; //圆的半径
private int errorValue = 10; //圆的区域误差值
private void touch_start(float x, float y) {
// mPath.reset();
// mPath.moveTo(x, y);
if(!isCenterLocated){
mX = x;
mY = y;
rectF = new RectF(left+errorValue, top+errorValue, left+viewWidth-errorValue, top+viewHeight-errorValue);
centerX = left + viewWidth/2;
centerToTop = top+viewHeight/2;
circleR = viewWidth/2 - errorValue;
isCenterLocated = true;
}
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
// mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}
private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
// touch_up();
// invalidate();
break;
}
return true;
}
}