deet1的笔记 https://bbs.21ic.com/?425203 [收藏] [复制] [RSS]

日志

自定义旋转控件

已有 141 次阅读2018-8-6 18:57 |个人分类:Android|系统分类:兴趣爱好

package com.example.huyong.myapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class TempControlView extends View {
    private Paint dialPaint;
    private float pointerAngle = 0;
    private float currentAngle = 0;
    private float increaseAngle = 0;

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

    public TempControlView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TempControlView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        dialPaint = new Paint();
        dialPaint.setAntiAlias(true);
        dialPaint.setStrokeWidth(10);
        dialPaint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.save();
        canvas.translate(getWidth() / 2, getHeight() / 2);
        dialPaint.setColor(Color.parseColor("#3CB7EA"));
        canvas.rotate(135);
        for (int i = 0; i < 28; i++) {
            canvas.drawLine(getWidth() * 2 / 6, 0, getWidth() * 2 / 6 - 60, 0, dialPaint);
            canvas.rotate(10);
        }
        canvas.rotate(80);

        dialPaint.setStrokeWidth(12);
        dialPaint.setColor(Color.YELLOW);
        pointerAngle = (increaseAngle/10)*10;
        canvas.rotate(increaseAngle);
        canvas.drawLine(getWidth() * 2 / 6, 0, getWidth() * 2 / 6 - 60, 0, dialPaint);
        dialPaint.setStyle(Paint.Style.FILL);
        dialPaint.setColor(Color.LTGRAY);
        canvas.drawCircle(0, 0, getWidth() * 2 / 6 - 120, dialPaint);
        dialPaint.setColor(Color.GRAY);
        canvas.drawCircle(0, 0, getWidth() * 2 / 6 - 160, dialPaint);

        Path path = new Path();
        path.moveTo(getWidth() * 2 / 6 - 80, 0);
        path.lineTo(getWidth() * 2 / 6 - 180, 50);
        path.lineTo(getWidth() * 2 / 6 - 180, -50);
        path.close();
        canvas.drawPath(path, dialPaint);
        canvas.restore();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                currentAngle = calcAngle(event.getX(), event.getY());
                Log.i("Norman","down state:"+event.getX()+" "+event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                float angle = calcAngle(event.getX(), event.getY());
                angle -= currentAngle;
                increaseAngle += angle;
                Log.i("Norman","move state:"+event.getX()+" "+event.getY());
//                invalidate();
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_UP:
                Log.i("Norman","up state:"+event.getX()+" "+event.getY());
                Log.i("Norman","Distance:"+increaseAngle);
                invalidate();
                break;
        }
//        return super.onTouchEvent(event);
        return true;
    }

    private float calcAngle(float targetX, float targetY) {
        float x = targetX - getWidth() / 2;
        float y = targetY - getHeight() / 2;
        double radian;

        if (x != 0) {
            float tan = Math.abs(y / x);
            if (x > 0) {
                if (y >= 0) {
                    radian = Math.atan(tan);
                } else {
                    radian = 2 * Math.PI - Math.atan(tan);
                }
            } else {
                if (y >= 0) {
                    radian = Math.PI - Math.atan(tan);
                } else {
                    radian = Math.PI + Math.atan(tan);
                }
            }
        } else {
            if (y > 0) {
                radian = Math.PI / 2;
            } else {
                radian = -Math.PI / 2;
            }
        }
        return (float) ((radian * 180) / Math.PI);
    }
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)