这个按钮在很地方可以看到,比如音箱音量调控、原来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) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10858775
每日一句
Challenges spark life; conquering them gives purpose.
挑战点亮生活,征服赋予意义。
挑战点亮生活,征服赋予意义。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员