编辑:Android绘制针图像到这个圆圈类似米仪表

sil*_*udo 9 android android-custom-view android-canvas

到目前为止,我能够使用一些代码引用表stackoverflow绘制半圆.现在我想把针扎到这个半圆圈.我不知道如何做到这一点.这是Semi circle代码

    package in.ashish29agre.stackoverflow.sample.semicircle;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.view.View;

public class MyGraphView extends View {
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private float[] value_degree;
    private int[] COLORS = { Color.GREEN, Color.RED,  Color.GREEN, Color.RED };
    // size of bigger half circle
    RectF rectf = null;
    // size of smaller half circle
//    RectF rectf2 = new RectF(45, 45, 275, 275);
    // size of the smallest half circle
//    RectF rectf3 = new RectF(80, 80, 240, 240);

    int temp = 0;

    public MyGraphView(Context context, float[] values) {

        super(context);
        rectf = new RectF();
        value_degree = new float[values.length];
        for (int i = 0; i < values.length; i++) {
            value_degree[i] = values[i];
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = getMeasuredWidth();
        int height = getMeasuredHeight();
        rectf.set(100, 100, width - 100, height - 100);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);


        for (int i = 0; i < value_degree.length; i++) {
            // set type of "brush"
            paint.setStrokeWidth(128);
            paint.setStyle(Paint.Style.STROKE);
                    // agree
            if (i == 0) {
                final Path path = new Path();
                paint.setColor(COLORS[i]);
                // draw 3 paths to show 3 curves
                path.addArc(rectf, 180, value_degree[i] - 4);
//                path.addArc(rectf2, 180, value_degree[i] - 5);
//                path.addArc(rectf3, 180, value_degree[i] - 6);
                // draw the path
                canvas.drawPath(path, paint);

                // disagree
            } else {
                temp += (int) value_degree[i - 1];
                paint.setColor(COLORS[i]);
                final Path path = new Path();
                path.addArc(rectf, temp + 180 , value_degree[i] - 0);
//                path.addArc(rectf2, temp + 180 + 5, value_degree[i] - 5);
//                path.addArc(rectf3, temp + 180 + 6, value_degree[i] - 6);
                // draw the path
                canvas.drawPath(path, paint);
            }


            drawLine(canvas);

        }
    }
    private void drawLine(Canvas canvas) {
        float startAngle = 180;
        float sweepAngle = 180;
        Paint mPaint = new Paint();
        mPaint.setStrokeWidth(22f);
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        float startX = rectf.centerX();
        float startY = rectf.centerY();
        float radius = rectf.centerX() - 100;
        float angle = (float) ((startAngle + sweepAngle / 2) * Math.PI / 180);
        float stopX = (float) (startX + radius * Math.cos(angle));
        float stopY = (float) (startY + radius * Math.sin(angle));

        canvas.drawLine(startX, startY, stopX, stopY, mPaint);
    }


}
Run Code Online (Sandbox Code Playgroud)

从我称之为活动的活动

float values[] = { 10, 20, 30, 40};
LinearLayout linear = (LinearLayout) findViewById(R.id.graph_view);
        values = calculateData(values);
        // draw the graf
        linear.addView(new MyGraphView(this, values));
Run Code Online (Sandbox Code Playgroud)

这是我的活动xml代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="in.ashish29agre.stackoverflow.sample.semicircle.SemiCircleActivity">

    <LinearLayout
        android:id="@+id/graph_view"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:orientation="vertical"
        android:layout_centerInParent="true"
        android:layout_alignParentTop="true"></LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

目前这个视图看起来像这样我希望添加可以从0-180度移动的仪表手.

任何帮助将不胜感激.

现在,我已经绘制了针,我想做针位图?

Joh*_*nzo 5

您可能想要为针位图设置动画。这是我的代码:

RotateAnimation animation = 
    new RotateAnimation(
        mCurrentAngle,
        toAngle,
        Animation.RELATIVE_TO_SELF,
        pivotX,
        Animation.RELATIVE_TO_SELF, 
        pivotY);

animation.setRepeatCount(0);
animation.setFillAfter(true);
animation.setFillEnabled(true);
animation.setInterpolator(new OvershootInterpolator());
animation.setDuration(duration);
mMeterPointer.startAnimation(animation);
Run Code Online (Sandbox Code Playgroud)

其中 mMeterPointer 是指针的 ImageView。

和值应位于针图像应旋转的位置pivotX。如果您希望它在位图的中间旋转,pivotY它们的值应该是,例如 0.5 和 0.5。0 to 1