11

好的,所以我已经尝试了几天,但我无处可去。所以我有以下两张图片:

第一个是转速计

转速计

第二张图片是一个全白图形,表示转速表已满:

全尺寸

我想做以下事情:

  1. 询问用户 RPM 输入,例如,如果他们输入 1.2,仪表将按如下方式填充:

输出

我有用户输入工作我需要动画方面的帮助。这是我尝试过的:

  1. 我曾尝试使用 PorterDuff,但它还会在背景中夹住仪表,而不仅仅是白条
  2. 我尝试将图像拆分为小位图并将它们存储到数组中,以便我可以回忆部分,但这很慢并且经常崩溃
  3. 我通过首先将 Gauge 应用到画布然后保存画布取得了一些进展:canvas.save(); 然后在白色图像上剪切路径,然后恢复画布。但是我不知道如何以圆形方式从左下角到右下角 (CW) 180 度进行剪辑。这是最好的方法吗?

我知道可能有一种更简单或更有效的方法来做到这一点,我只是不知道。有人有什么好主意吗?

*注意所有图片都是PNG的

提前致谢!

4

2 回答 2

9

正如您已经发现的那样,我会使用剪辑:

  • 绘制背景图像
  • 设置剪辑
  • 绘制前景图像

我会用

Canvas.clipPath()

路径看起来像从圆心开始的饼图,如下所示:

剪辑路径

要创建剪辑路径,请使用以下内容:

public class PieView extends View {

    private int width = 200;
    private int angleStart = 135;
    private int sweep = 270;

    private Path p;

    private Paint paint = new Paint();

    public PieView(Context context, AttributeSet attrs) {
    super(context, attrs);
        p = new Path();
        //move into center of the circle
        p.setLastPoint(width/2, width/2);
        //add line from the center to arc at specified angle
        p.lineTo(width/2+(float)Math.cos(Math.toRadians(angleStart))*(width/2), 
                 width/2+(float)Math.sin(Math.toRadians(angleStart))*(width/2));
        //add arc from start angle with specified sweep
        p.addArc(new RectF(0, 0, width, width), angleStart, sweep);
        //from end of arc return to the center of circle
        p.lineTo(width/2, width/2);

        paint.setColor(Color.RED);
        paint.setStrokeWidth(1);
        paint.setStyle(Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(0,0,width,width, paint);
        canvas.drawPath(p,paint);
    }
}
于 2011-05-27T19:35:17.457 回答
1

这是从 Android ApiDemos 绘制弧线的方法:http: //developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.html

然后您需要使用 xfermode 通过使用从位图派生的画布来删除顶部图像的一部分。您可以在此处查看此方法的一个示例:使位图的某些区域在触摸时透明

于 2011-05-27T23:07:12.267 回答