android+炫酷按钮,android酷炫按钮-微调按钮

这个按钮在很地方可以看到,比如音箱音量调控、原来DVD功放上的按钮等等……

今天因为项目需要,于是简单写了一个这样的按钮。看看效果吧!

329fdab5d735705ba6132a90c96562ee.gif

还有点灯灯,看源码: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();// 逆时针

}

}1693bb051f4710b5758dfab141a98e4d.pngff71ca9edede968fe9feb9df324d5f97.png497a0dd7306f9de623c5c6bb944e81f1.png

上面是需要用到的图片,当然了,你可以设计自己喜欢的图片.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值