ภาพวาดบนผืนผ้าใบ


คำตอบ:


181

วิธีที่ดีในการวาด Drawable บนผืนผ้าใบไม่ใช่การถอดรหัสด้วยตัวเอง แต่ปล่อยให้ระบบทำดังนี้

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

สิ่งนี้จะใช้ได้กับ drawables ทุกประเภทไม่เพียง แต่บิตแมปเท่านั้น และยังหมายความว่าคุณสามารถใช้ drawable เดิมนั้นซ้ำได้อีกครั้งหากมีการเปลี่ยนแปลงขนาดเท่านั้น


หนึ่งใช้รายการภาพเคลื่อนไหว (หลายเฟรม) สำหรับภาพเคลื่อนไหวด้วยวิธีผ้าใบอย่างไร
RichieHH

1
มีประโยชน์มาก! อย่างน้อยเมื่อคุณต้องการเพียงภาพพื้นหลังโดยไม่มีวิทยาศาสตร์จรวดเข้ามาเกี่ยวข้อง!
Asim

@RichieHH ฉันมีพื้นหลังของฉันบน SurfaceView (น่าจะเป็นของเสีย) และมุมมองพื้นผิวนั้นฝังอยู่ในเฟรมเลย์เอาต์และเฟรมเลย์เอาต์นั้นมี ImageViews ที่ฉันทำให้เคลื่อนไหว - นั่นอาจเป็นตัวเลือกสำหรับคุณ?
AgentKnopf

4
getDrawable (id) กำลังเลิกใช้งานคุณควรใช้การเรียก ContextCompat ด้านบนหรือการเรียก getDrawable (id, theme) developer.android.com/reference/android/content/res/…
wblaschko

@ ซาเวน: แน่ใจเหรอ? เท่าที่ฉันจำได้นี่น่าจะใช้ได้กับ Android เวอร์ชันแรกสุด
Gábor

39

คุณต้องโหลดภาพของคุณเป็นบิตแมป:

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

จากนั้นทำให้บิตแมปไม่แน่นอนและสร้างผืนผ้าใบทับ:

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

จากนั้นคุณสามารถวาดบนผืนผ้าใบ


จะเกิดอะไรขึ้นถ้า. png ของฉันใหญ่และถูกตัดหลังจากโหลด? เช่นฉันไม่ต้องการให้มีการครอบตัด อาจใหญ่กว่าหน้าจอแล้วฉันจะพยายามทำให้มันซูมได้และเคลื่อนย้ายได้ ฉันจะทำเช่นนั้นได้อย่างไร? ขอบคุณมาก!
Sibbs Gambling

1
@ perfectionm1ng ดูการใช้ BitmapRegionDecoder อนุญาตให้โหลดบางส่วนสำหรับภาพขนาดใหญ่ ดังนั้นคุณควรจะสามารถโหลดเฉพาะส่วนของภาพที่คุณกำลังแสดงอยู่ในขณะนี้
Konstantin Burov

ฉันมีปัญหาเดียวกันกับฉันใช้รหัส Canvas cs = ผ้าใบใหม่ (บิตแมป); ทรัพยากร res = getResources (); บิตแมป bitmapx = BitmapFactory.decodeResource (res, R.drawable.overlay_good_full); บิตแมป bitmapxx = BitmapFactory.decodeResource (res, R.drawable.overlay_bad_full); ถ้า (text.equals ("ดี")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan

การสร้างออบเจ็กต์ผ้าใบใหม่จะวาดบนผืนผ้าใบของ onDraw ได้อย่างไร?
Siddarth G

14

คุณยังสามารถใช้วิธีนี้ มันจะเปลี่ยนขนาดใหญ่ให้พอดีกับผ้าใบของคุณ:

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

คลาส BitmapFactory ไม่มีเมธอด "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic

@Crisic ฉันจะถือว่าyourDrawableเป็นจำนวนเต็ม

11
Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
d.setBounds(left, top, right, bottom);
d.draw(canvas);

ฉันสร้าง Drawable ด้วย gerResource (). getDrawable (id);
Vikram

getDrawable (id) กำลังเลิกใช้งานคุณควรใช้การเรียก ContextCompat ด้านบนหรือการเรียก getDrawable (id, theme) developer.android.com/reference/android/content/res/…
wblaschko

1
setBoundsสำหรับผมมันเป็นสิ่งจำเป็นที่จะใช้ ไม่มีสิ่งใดปรากฏขึ้น

8

ลองดู

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
AndroidDev

2
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);

    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.