Android手势画圆

废话不多说直接上代码。

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;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值