【问题标题】:Drawable image on a canvas画布上的可绘制图像
【发布时间】:2021-05-21 22:37:53
【问题描述】:

如何将图像放到画布上以便在该图像上绘图?

【问题讨论】:

    标签: android android-canvas android-drawable


    【解决方案1】:

    在画布上绘制 Drawable 的好方法不是自己解码,而是让系统来完成:

    Drawable d = getResources().getDrawable(R.drawable.foobar, null);
    d.setBounds(left, top, right, bottom);
    d.draw(canvas);
    

    这适用于所有类型的可绘制对象,而不仅仅是位图。这也意味着只要大小发生变化,您就可以再次重复使用同一个可绘制对象。

    【讨论】:

    • 如何通过画布方法使用动画列表(多帧)制作动画?
    • 非常有用!至少当您只需要一张不涉及火箭科学的背景图片时!
    • @RichieHH 我在 SurfaceView 上有我的背景(可能是浪费),并且该表面视图嵌入在 Framelayout 中,并且该 framelayout 包含 ImageViews,然后我对其进行动画处理 - 也许这对你来说是一个选择?跨度>
    • getDrawable(id) 已被弃用,您应该使用上面的 ContextCompat 调用,或者 getDrawable(id, theme) 调用。 developer.android.com/reference/android/content/res/…
    • @Saveen:你确定吗?据我所知,这应该适用于最早的 Android 版本。
    【解决方案2】:

    您需要将图像加载为位图:

     Resources res = getResources();
     Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.your_image);
    

    然后使位图可变并在其上创建一个画布:

    Canvas canvas = new Canvas(bitmap.copy(Bitmap.Config.ARGB_8888, true));
    

    然后你就可以在画布上画画了。

    【讨论】:

    • 如果我的 .png 文件很大并且在加载后被剪切了怎么办?即我不想裁剪它。它可以比屏幕大,然后我会尝试使它可缩放和可移动。我该怎么做?非常感谢!
    • @perfectm1ng 看看使用 BitmapRegionDecoder。它允许部分加载大图像。因此,您现在应该只能加载您正在渲染的图像部分。
    • 我有同样的问题,我正在使用代码 Canvas cs = new Canvas(bitmap);资源 res = getResources();位图 bitmapx = BitmapFactory.decodeResource(res, R.drawable.overlay_good_full);位图 bitmapxx = BitmapFactory.decodeResource(res, R.drawable.overlay_bad_full); if(text.equals("Good")) { cs.drawBitmap(bitmapx, 0, 0, tPaint); } else { cs.drawBitmap(bitmapxx, 0, 0, tPaint); }
    • 创建新的canvas对象如何在onDraw的canvas上绘制?
    【解决方案3】:

    您也可以使用这种方式。它会改变你的大drawble适合你的画布:

    Resources res = getResources();
    Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
    yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);
    

    【讨论】:

    • BitmapFactory 类没有方法“BitmapFactory.decodeResource(Resource, Drawable);”...
    • @Crisic 我假设yourDrawable 是一个整数。
    【解决方案4】:
    Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
    d.setBounds(left, top, right, bottom);
    d.draw(canvas);
    

    【讨论】:

    • 我用gerResource().getDrawable(id)创建了Drawable;
    • getDrawable(id) 已被弃用,您应该使用上面的 ContextCompat 调用,或者 getDrawable(id, theme) 调用。 developer.android.com/reference/android/content/res/…
    • 对我来说,必须使用setBounds。没有它,什么都不会显示。
    【解决方案5】:

    试试这个

    Bitmap mBitmap = Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);
    
    protected void onDraw(Canvas canvas) {
                canvas.drawColor(0xFFAAAAAA);
                canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    
            }
    

    【讨论】:

    • 但是如果我使用 canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);它可以工作并将保存的图像加载到画布上,但同时撤消和重做停止工作,检查我的代码pastebin.com/cP9w6stm
    【解决方案6】:
    package com.android.jigsawtest;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    public class SurafaceClass extends SurfaceView implements
            SurfaceHolder.Callback {
        Bitmap mBitmap;
    Paint paint =new Paint();
        public SurafaceClass(Context context) {
            super(context);
            mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.BLACK);
            canvas.drawBitmap(mBitmap, 0, 0, paint);
    
        }
    
    }
    

    【讨论】:

      【解决方案7】:

      为了保持我的矢量可绘制对象的纵横比,我这样做了:

      val drawable = resources.getDrawable(R.drawable.my_vector, null)
      val aspectRatio = drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight
      val desiredWidthInPx = 100
      val derivedHeightInPx = (desiredWidthInPx / aspectRatio).toInt()
      drawable.setBounds(0, 0, desiredWidthInPx, derivedHeightInPx)
      drawable.draw(canvas)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2011-01-11
        • 2013-07-20
        • 1970-01-01
        • 2020-04-14
        相关资源
        最近更新 更多