Android小新人 2019-05-28 14:07 采纳率: 0%
浏览 1027

关于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条回答 默认 最新

  • SHEGANG2020 2019-05-28 16:12
    关注

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

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog