• android自定义view仿照MIUI中音量控制效果


    先看效果图:

    这就是miui中的音量效果图,实现思路是自定义视图,绘制圆环,然后设置进度显示。

    核心代码在onDraw中实现如下:

    @Override
        protected void onDraw(Canvas canvas) {
            float cx = getMeasuredWidth() / 2;
            float cy = getMeasuredHeight() / 2;
            r1 = cx - w1 / 2;
            r2 = cx - w1 / 2 - w2 / 2;
            r3 = cx - w1 / 2 - w2;
    
            // 绘制外圆
            paint.setStrokeWidth(w1);
            paint.setColor(Color.parseColor("#454547"));
            canvas.drawCircle(cx, cy, r1, paint);
    
            // 绘制中间圆环
            paint.setColor(Color.parseColor("#747476"));
            paint.setStrokeWidth(w2);
            canvas.drawCircle(cx, cy, r2, paint);
    
            // 绘制内圆
            paint.setColor(Color.parseColor("#464648"));
            paint.setStyle(Style.FILL);
            canvas.drawCircle(cx, cy, r3, paint);
    
            // 绘制中间的图片
            canvas.drawBitmap(bitmap, cx - bitmap.getWidth() / 2,
                    cx - bitmap.getHeight() / 2, paint);
    
            // 绘制文本
            paint.setColor(Color.WHITE);
            paint.setStrokeWidth(0);
            paint.setTextSize(40);
            float textWidth = paint.measureText("铃声"); // 测量字体宽度,我们需要根据字体的宽度设置在圆环中间
    
            canvas.drawText("铃声", cx - textWidth / 2, cx + bitmap.getHeight() / 2
                    + 40, paint);
    
            // 绘制进度
            paint.setStyle(Style.STROKE);
            paint.setStrokeWidth(w2);
            paint.setColor(Color.WHITE);
            RectF oval = new RectF(cx - r2, cy - r2, cx + r2, cy + r2); // 用于定义的圆弧的形状和大小的界限
            canvas.drawArc(oval, 270, 360 * progress / 100, false, paint);
    
            super.onDraw(canvas);
        }

    然后就是自定义toast,加载上面的自定义控件。

    public class VolumnController {
        Toast t;
        VolumnView tv;
    
        Context context;
    
        public VolumnController(Context context) {
            this.context = context;
        }
    
        public void show(float progress) {
            if (t == null) {
                t = new Toast(context);
                View layout = LayoutInflater.from(context).inflate(R.layout.vv,
                        null);
                tv = (VolumnView) layout.findViewById(R.id.volumnView1);
                t.setView(layout);
                t.setGravity(Gravity.BOTTOM, 0, 100);
                t.setDuration(Toast.LENGTH_SHORT);
            }
            tv.setProgress(progress);
            t.show();
        }
    }

    最后附上所有的源码:点击我!!!

  • 相关阅读:
    Windows下MySQL多实例运行
    Java中,什么时候用logger.debuge,info,error
    乒乓球(Table Tennis)
    [Delphi]Delphi学习
    [CALL]01
    [转自看雪]新手学习计划
    [JAVA]函数
    [1.1]
    [SQL]课堂记录
    [SYS]VS2010驱动开发配置
  • 原文地址:https://www.cnblogs.com/Jaylong/p/volumn.html
Copyright © 2020-2023  润新知