如何在android中仅绘制一幅图像?

如何在android中仅绘制一幅图像?,android,android-imageview,android-animation,Android,Android Imageview,Android Animation,其目的是有一个空水桶,并根据(改变的)系统参数将其装满最小值=0,最大值=系统参数 我确实有水桶图像(*.png带透明胶片),我知道我应该使用画布/可画物,但我如何才能在水桶内绘制水(蓝色) 我可以改变整个背景,但它会填满桶的内部和外部。以下是解决方案 第一步 复制/粘贴以下自定义类 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import andro

其目的是有一个空水桶,并根据(改变的)系统参数将其装满<代码>最小值=0,最大值=系统参数

我确实有水桶图像(
*.png
带透明胶片),我知道我应该使用
画布/可画物
,但我如何才能在水桶内绘制水(蓝色)


我可以改变整个背景,但它会填满桶的内部和外部。

以下是解决方案

第一步 复制/粘贴以下自定义类

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.ImageView;

public class DrawView extends ImageView {

    Paint mPaint;
    int percent = 0;
    int toFillHeight;
    private RectF box;

    public DrawView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setColor(Color.GRAY);
        mPaint.setStyle(Paint.Style.FILL);
        box = new RectF(0, 0, getWidth(), getHeight());
    }

    public DrawView(Context context) {
        super(context);
    }

    public int calculateFillArea() {
        return percent * 200 / getHeight();
    }

    public void setPercentage(int percent) {
        this.percent = percent;
        invalidate();
    }

    @Override
    public void onDraw(Canvas canvas) {

        //you can remove these two lines if you don't want background color
        mPaint.setColor(Color.GRAY);
        canvas.drawRect(new RectF(0, 0, getWidth(), getHeight()), mPaint);

        toFillHeight = calculateFillArea();

        // Arc
        mPaint.setColor(Color.parseColor("#33b5e5"));
        box.set(0, getHeight() - toFillHeight, getWidth(), getHeight());
        canvas.drawRect(box, mPaint);

    }
}
步骤2 在布局中使用该自定义类,如下所示

<com.example.rounded.DrawView
    android:id="@+id/view1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@drawable/ic_launcher"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" />

步骤3 下面是我使用它的方式

public class MainActivity extends Activity {

    DrawView view;
    int percentage = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        view = (DrawView) findViewById(R.id.view1);

        Thread t = new Thread() {
            public void run() {
                while (percentage < 99) {
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            view.setPercentage(percentage);
                            percentage++;
                        }
                    });
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        };
        t.start();
    }
}
公共类MainActivity扩展活动{
DrawView视图;
整数百分比=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
视图=(DrawView)findViewById(R.id.view1);
线程t=新线程(){
公开募捐{
而(百分比<99){
MainActivity.this.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
视图。设置百分比(百分比);
百分比++;
}
});
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
};
t、 start();
}
}
注意

这是一个粗略的例子。您需要根据需要更改
DrawView
。我刚刚用蓝色填充了那个长方形


您可以使用
setPercentage(int)
方法
DrawView

在绘制第二个一组剪辑区域画布之前,使用两个PNG填充矩形:一个是空的,一个是满的。clipRect()显示当前的水位我有一个解决方案。。请稍等。。测试并给您一份该文件的工作副本:)请核对我的答案。你觉得这很有帮助。如果它对您有帮助,请接受并向上投票:)它在view.setPercentage(percentage)上提供空指针验证。不可能。你对代码做了什么修改吗?这是一个经过测试的代码。我已经写了它并在设备上签了名。运行非常顺利。不,只是复制/粘贴。如果我对view.setPercentage(percentage)行进行注释,它可以正常工作。您可以向我显示它提供的代码行或错误的日志吗。这样我就可以解决这个问题了…当然可以,但只能在以后-这里没有代码。但我有一个问题,它会在图像(所谓的桶)上工作,而不在外部绘制吗?我必须定义“桶”的界限吗