关于Android 自定义View中的onDraw里的drawBitmap。

关于Android 自定义View中的onDraw里的drawBitmap

有一个半圆的图片,是一个统计图(就是油箱表的那样),还有一个指针的图片要把指针添加到图片里,然后传值让那个指针根据而移动。
找不到什么方法,所以求教下大神
我现在能把指针添加在图片里就是怎么让指针头移动不会做
我的代码是:

  float getx;
    float gety;
    float jiangex,jiangey,yuandianx,yuandiany;
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //获取控件的X轴
        getx = getX();
        //获取控件的Y轴
        gety = getY();
        //将X轴分成10份
        jiangex = getWidth() / 10;
        //将Y轴分成5份
        jiangey = getHeight()/5;
        //设置一个X轴原点让X轴在中间
        yuandianx = getx+jiangex*5;
        //设置一个Y轴原点
        yuandiany = gety+jiangey;
        //画笔1
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(5);
        paint.setAntiAlias(true);
        //画笔2
        Paint paint1 = new Paint();
        paint1.setColor(Color.BLUE);
        paint1.setStrokeWidth(5);
        paint1.setAntiAlias(true);
        //添加图片
        Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.zhen);

        //让图片在控件上显示
        canvas.drawBitmap(bitmap, yuandianx,yuandiany-30, paint1);

    }


1个回答

拿到了对应的bitmap,这时候我们如果要将它绘制在屏幕上,需要创建两个Rect。第一个Rect 代表要绘制的bitmap 区域,第二个 Rect 代表的是要将bitmap 绘制在屏幕的什么地方,此时我先定义两个Rect,mSrcRect 取值为整个Bitmap 区域 ,mDestRect 取值为view在屏幕的位置和bitmap同样大小。

```private Rect mSrcRect, mDestRect;
mSrcRect = new Rect(0, 0, mBitWidth, mBitHeight);
mDestRect = new Rect(0, 0, mBitWidth, mBitHeight);
canvas.drawBitmap(mBitmap, mSrcRect, mDestRect, mBitPaint);

这样就将图片绘制在你想要的位置,然后在写一个移动的动画,去执行postInvalidate();重绘动作即可
例如以下代码示例,传入相应的坐标位置即可

public void startTranslate() {
startTranslate(0, 0, 200, 200, 1000);
}

/**
 * 移动位图
 * 
 * @param startLeft 起始左边距
 * @param startTop 起始距上边距离
 * @param toLeft 到达左边距
 * @param toTop 到达上边距
 * @param duration 时长
 */
public void startTranslate(int startLeft, int startTop, int toLeft, int toTop, long duration) {
    mStartLeft = startLeft;
    mStartTop = startTop;

    mToLeft = toLeft;
    mToTop = toTop;

    // 使用ValueAnimator创建一个过程
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
    valueAnimator.setDuration(duration);
    valueAnimator.setInterpolator(new AccelerateInterpolator());
    valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animator) {
            // 不断重新计算上下左右位置
            float fraction = (Float) animator.getAnimatedValue();
            int currentLeft = (int) ((mToLeft - mStartLeft) * fraction + mStartLeft);
            int currentTop = (int) ((mToTop - mStartTop) * fraction + mStartTop);
            if (mDestRect == null) {
                mDestRect = new Rect(currentLeft, currentTop, currentLeft + mBitWidth,
                        currentTop + mBitHeight);
            }
            mDestRect.left = currentLeft;
            mDestRect.right = currentLeft + mBitWidth;
            mDestRect.top = currentTop;
            mDestRect.bottom = currentTop + mBitHeight;
            // 重绘
            postInvalidate();
        }
    });
    valueAnimator.start();
}
qq_37557213
Android小新人 mBiWidth和mBitHeight里面的参数都是代表什么 我自己修改了下参数可是图片变得让我无奈
8 个月之前 回复
qq_37557213
Android小新人 mSrcRect = new Rect(0, 0, mBitWidth, mBitHeight); mDestRect = new Rect(0, 0, mBitWidth, mBitHeight);
8 个月之前 回复
qq_22225183
SHEGANG2020 回复Android小新人: 改变绘制的坐标就相当于移动动画了
8 个月之前 回复
qq_37557213
Android小新人 而且只有一个图片怎么弄啊
8 个月之前 回复
qq_37557213
Android小新人 有点不太明白 ,我是新人不太懂,移动动画怎么做啊
8 个月之前 回复
qq_22225183
SHEGANG2020 回复Android小新人: 不用啊,我的意思是你将你的绘制图给一个移动的动画,然后每次绘制图的坐标改下就好了啊
8 个月之前 回复
qq_37557213
Android小新人 这位朋友 你说的是再加几个指针的图片然后做移动吗
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问