自定义旋转控件
已有 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);
}
}