关于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);
}
拿到了对应的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();
}