एक कैनवास पर खींचने योग्य छवि


जवाबों:


176

एक कैनवास पर एक ड्रॉबल खींचने का अच्छा तरीका यह खुद को डिकोड करना नहीं है, लेकिन ऐसा करने के लिए सिस्टम पर छोड़ रहा है:

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

यह बिटमैप्स ही नहीं, सभी प्रकार के ड्रॉबल्स के साथ काम करेगा। और इसका मतलब यह भी है कि यदि आप केवल आकार बदलते हैं तो आप उसी ड्रॉबल को फिर से उपयोग कर सकते हैं।


कैनवास के दृष्टिकोण के साथ एनीमेशन के लिए एक एनीमेशन-सूची (कई फ्रेम) का उपयोग कैसे किया जाता है?
रिची एचएच

1
बहुत उपयोगी! कम से कम जब आपको कोई बैकग्राउंड पिक्चर चाहिए जिसमें कोई रॉकेट साइंस शामिल न हो!
असीम

@ RichieHH मैं एक सतह दृश्य (संभवत: एक बेकार) पर मेरी पृष्ठभूमि है और उस सतह दृश्य को एक Framelayout में एम्बेड किया गया है और उस framelayout में ImageViews शामिल हैं, जो मैं तब चेतन करता हूं - शायद यह आपके लिए एक विकल्प है?
AgentKnopf

4
getDrawable (id) को हटा दिया जा रहा है, आपको या तो ऊपर ContextCompat कॉल का उपयोग करना चाहिए, या getDrawable (id, theme) कॉल का। डेवलपर
.android.com

@ नवीन: क्या आपको यकीन है? जहां तक ​​मुझे याद है, यह एंड्रॉइड के शुरुआती संस्करणों से काम करने वाला है।
गबोर

38

आपको अपनी छवि को बिटमैप के रूप में लोड करने की आवश्यकता है:

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

फिर बिटमैप को परिवर्तनशील बनाएं और उसके ऊपर एक कैनवास बनाएं:

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

फिर आप कैनवास पर आकर्षित कर सकते हैं।


यदि मेरा .png बड़ा है और लोड होने के बाद वह कट जाता है तो क्या होगा? यानी मैं डॉन, यह फसली करना चाहते हैं। यह स्क्रीन से बड़ा हो सकता है, फिर मैं इसे ज़ूम करने योग्य और जंगम बनाने की कोशिश करूंगा। मैं ऐसा कैसे कर सकता हूं? आपका बहुत - बहुत धन्यवाद!
सिब्ब्स जुआ 8

1
@ perfectionm1ng BitmapRegionDecoder का उपयोग करके देखो। यह बड़ी छवियों के लिए आंशिक लोडिंग की अनुमति देता है। इसलिए आपको उस समय केवल उसी छवि को लोड करने में सक्षम होना चाहिए जो आप प्रदान कर रहे हैं।
कोनस्टैंटिन ब्यूरोव

मुझे एक ही समस्या है कि मैं कैनवस सीएस = नया कैनवस (बिटमैप) कोड का उपयोग कर रहा हूं; संसाधन रिस = getResources (); Bitmap bitmapx = BitmapFactory.decodeResource (res, R.drawable.overlay_good_full); Bitmap bitmapxx = BitmapFactory.decodeResource (res, R.drawable.overlay_bad_full); if (text.equals ("अच्छा")) {cs.drawBitmap (बिटमैप, 0, 0, tPaint); } और {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
अहमद अर्सलान

OnDraw के कैनवस पर नए कैनवस ऑब्जेक्ट कैसे बनाते हैं?
सिद्धार्थ जी

13

भी आप इस तरह से उपयोग कर सकते हैं। यह आपके कैनवस में आपकी बड़ी क्षमता को बदल देगा:

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

...; BitmapFactory वर्ग विधि "BitmapFactory.decodeResource (संसाधन, Drawable)" नहीं है
Crisic

@ क्रिसिक मैं मानूंगा कि yourDrawableयह एक पूर्णांक है।

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

मैं gerResource () के साथ Drawable बनाता हूं। getDrawable (id);
विक्रम

getDrawable (id) को हटा दिया जा रहा है, आपको या तो ऊपर ContextCompat कॉल का उपयोग करना चाहिए, या getDrawable (id, theme) कॉल का। डेवलपर
.android.com

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

        }

लेकिन अगर मैं कैनवास का उपयोग करता हूं। बिटमैप (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);

    }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.