android酷炫按钮-微调按钮

这个按钮在很地方可以看到,比如音箱音量调控、原来DVD功放上的按钮等等……
因为项目需要,于是简单写了一个这样的按钮。看看效果吧!
在这里插入图片描述
有点灯灯,看源码:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
 
public class RotateImageView extends ImageView {
    private float degree = 90;
    private int cx;
    private int cy;
    private Bitmap point;
    PointMark[] pms = new PointMark[4];
    private static final int range = 20;
    private DegreeChangeListener degreeChangeListener;
    public RotateImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        point = BitmapFactory.decodeResource(getResources(), R.drawable.point);
        for (int i = 0; i < pms.length; i++) {
            pms[i] = new PointMark();
            pms[i].active = false;
            pms[i].leave = true;
        }
        pms[1].active = true;
        pms[1].leave = false;
    }
    public void setDegreeChangeListener(
            DegreeChangeListener degreeChangeListener) {
        this.degreeChangeListener = degreeChangeListener;
    }
    public float getDegree() {
        return degree;
    }
    public void setDegree(float degree) {
        this.degree = degree;
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        cx = getWidth() >> 1;
        cy = getHeight() >> 1;
    }
    /**
     * @param canvas
     * @param dir
     */
    private void showPoint(Canvas canvas, int dir) {
        if (pms[dir].active) {
            canvas.save();
            switch (dir) {
            case 0:
                canvas.rotate(-90, cx, cy);
                break;
            case 1:
                canvas.rotate(0, cx, cy);
                break;
            case 2:
                canvas.rotate(90, cx, cy);
                break;
            case 3:
                canvas.rotate(180, cx, cy);
                break;
            }
            if (point != null)
                canvas.drawBitmap(point, getLeft(), getTop(), null);
            canvas.restore();
        }
    }
    private void change(int index) {
        if (pms[index].leave) {
            pms[index].active = !pms[index].active;
            pms[index].leave = false;
        }
    }
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        // 90度初始值degree:0~360 顺序左上右下
        canvas.save();
        canvas.rotate(degree - 90, cx, cy);
        super.onDraw(canvas);
        canvas.restore();
        if (degree >= 360 - range && degree <= 360 || degree >= 0
                && degree <= range) {
            // 左边
            change(0);
            showPoint(canvas, 0);
        } else {
            pms[0].leave = true;
            showPoint(canvas, 0);
        }
        if (degree >= 90 - range && degree <= 90 + range) {
            // 上边
            change(1);
            showPoint(canvas, 1);
        } else {
            pms[1].leave = true;
            showPoint(canvas, 1);
        }
        if (degree >= 180 - range && degree <= 180 + range) {
            // 右边
            change(2);
            showPoint(canvas, 2);
        } else {
            pms[2].leave = true;
            showPoint(canvas, 2);
        }
        if (degree >= 270 - range && degree <= 270 + range) {
            // 下边
            change(3);
            showPoint(canvas, 3);
        } else {
            pms[3].leave = true;
            showPoint(canvas, 3);
        }
    }
    boolean inRange;// 是否在合理范围之内默认为30度
    int touchRange = 30;
    float lastDegree;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            float f = getRotation(cx, cy, event.getX(), event.getY(), 180);
            inRange = Math.abs(f - degree) < touchRange;
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            // if (inRange) {
            // 显示角度为0~180 -180-0 转成0~360
            degree = getRotation(cx, cy, event.getX(), event.getY(), 180);
            if (Math.abs(degree - lastDegree) > 10) {
                // 活动角度大于 10
                if (degreeChangeListener != null) {
                    boolean circle = (degree >= 0 && degree <= 90
                            && lastDegree <= 360 && lastDegree >= 270);// 回到原点
                    if (degree - lastDegree > 0 || circle)
                        degreeChangeListener.clockwise();
                    else
                        degreeChangeListener.anticlockwise();
                }
                lastDegree = degree;
            }
            invalidate();
            // }
        }
        return super.onTouchEvent(event);
    }
    float getRotation(float x1, float y1, float x2, float y2, float angle) {
        float value = (float) Math.toDegrees(Math.atan2(y2 - y1, x2 - x1));
        return value + angle;
    }
    private class PointMark {
        boolean active;
        boolean leave;
    }
    public interface DegreeChangeListener {
        /**
         * 顺时针
         */
        public void clockwise();// 顺时针
        /**
         * 逆时针
         */
        public void anticlockwise();// 逆时针
    }
}

最后奉上贴图,你也可以自己设计
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值