2011-03-31 9 views
25

काम करने के लिए मैं एंड्रॉयड ScaleDrawableएंड्रॉयड scaledrawable

बाहर कोशिश कर रहा हूँ लेकिन यह काम करने के लिए प्रतीत नहीं होता लगता नहीं है ... मैं प्रलेखन उदाहरण के रूप में xml बनाया है और मैं एक logo.png है drawable फ़ोल्डर

<?xml version="1.0" encoding="utf-8"?> 
<scale xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/logo" 
    android:scaleGravity="center_vertical|center_horizontal" 
    android:scaleHeight="80%" 
    android:scaleWidth="80%" /> 

में मैं drawable फ़ोल्डर में logo2.xml के रूप में इस बचाया तो मैं एक imageView साथ एक LinearLayout है और imageView की src "@ drawable/logo2" लेकिन लोगो नहीं है करने के लिए सेट प्रकट ... क्या मैं यहाँ कुछ गलत कर रहा हूँ? आप वास्तव में स्केल तत्व का उपयोग कैसे करते हैं?

उत्तर

26

बस आज मैं एक ही समस्या का सामना करना पड़ा। स्केलड्राउबल काम नहीं कर रहा है। कुछ जांच के बाद मुझे समाधान मिला:

यदि आप documentation पर देखते हैं तो आप यह वाक्यांश पा सकते हैं: "एक ड्रायबल जो अपने वर्तमान स्तर मान के आधार पर किसी अन्य ड्रायरेबल के आकार को बदलता है।" बस।

यह बाद मैंने पाया onBoundsChange() समारोह अजीब स्तर चर का उपयोग करता है स्पष्ट हो गया।

Resources res = getResources(); 
ScaleDrawable sd = (ScaleDrawable) res.getDrawable(R.drawable.logo2); 
Drawable d = sd.getDrawable(); 

d.setLevel(1); 

ImageView iv = new ImageView(this); 
iv.setImageDrawable(sd); 
iv.setAdjustViewBounds(true); 
iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

setContentView(iv); 

अद्यतन:

आप के लिए कोड कुछ इस तरह होगा मैं ड्रा() फ़ंक्शन में समस्या लगता है।

public void draw(Canvas canvas) { 
    if (mScaleState.mDrawable.getLevel() != 0) 
     mScaleState.mDrawable.draw(canvas); 
} 

अद्यतन:: क्योंकि एक आरंभीकरण के बाद के स्तर चर 0 है हो सकता है कि उसके बाद इस कोड को आपकी मदद कर सकता है: पैमाने drawable के बजाय

private void useScaledImage() { 
    Resources res = getResources(); 
    BitmapDrawable bd = (BitmapDrawable)res.getDrawable(R.drawable.sun); 
    Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), 
         (int) (bd.getIntrinsicHeight() * 0.7), 
         (int) (bd.getIntrinsicWidth() * 0.7), 
         false); 

    LinearLayout l = new LinearLayout(this); 
    ImageView iv = new ImageView(this); 

    iv.setImageDrawable(new BitmapDrawable(b)); 
    iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

    l.addView(iv); 

    setContentView(l); 
} 
+1

आपके उत्तर के लिए धन्यवाद, लगता है कि मैं क्या ScaleDrawable से उम्मीद नहीं है। मैंने सोचा कि एक बिटमैप (पीएनजी/जेपीजी/...) और फिर मैं इस बिटमैप को एक्सएमएल में ऊपर/नीचे स्केल कर सकता हूं, फिर अंतर आकार के साथ एकाधिक बिटमैप रखने के बजाय इसे अंतर लेआउट में उपयोग कर सकता हूं। एंड्रॉइड में कोई सुझाव जो आप कर सकते हैं? – stephenteh

+0

@stephenteh मेरे लिए, मुझे स्केलड्रावेबल से थंबनेल छवियों की तरह कुछ चाहिए। मुझे आपके लिए एक दिलचस्प समाधान मिला। स्रोत से createScaledBitmap का उपयोग करने के लिए (मैंने पूरे उत्तर में उदाहरण कोड जोड़ा। यहां यह फिट नहीं है।)। आप 0.7 मान को एक इंटीजर रिसोर्स (उदा। R.integer.myvalue) से बदल सकते हैं। और मुझे दो रोचक फ़ंक्शन मिल गए हैं: व्यू क्लासएक्स (..) और सेटस्केले (..) व्यू क्लास से। लेकिन वे 11 एपीआई से हैं। – m039

+0

धन्यवाद, आप एक सज्जन और विद्वान हैं। क्या हमें इसे एक बग के रूप में रिपोर्ट करना चाहिए? डिफ़ॉल्ट रूप से एक Drawable * अदृश्य * बनाने के लिए unintuitive लगता है। – phreakhead

5

उपयोग डालने drawable

<?xml version="1.0" encoding="utf-8"?> 
<inset xmlns:android="http://schemas.android.com/apk/res/android" 
    android:drawable="@drawable/logo" 
    android:insetTop="2dp" 
    android:insetLeft="2dp" 
    android:insetRight="2dp" 
    android:insetBottom="2dp" 
    > 
+0

हाँ, यह वास्तव में कुछ प्रारंभिक परीक्षण के साथ, मेरे लिए वास्तव में काम करता है। –

0

प्रारंभिक सवाल का जवाब करने के लिए, तुम सिर्फ 10 000 अपने onCreate में के साथ अपने ScaleDrawable के स्तर को प्रारंभ करने के लिए है। आप अपने imageView मिलता है, ImageButton के drawable getIcon या getBackground का उपयोग करने और फिर उस पर setLevel फोन (यदि आप एक स्रोत या एक पृष्ठभूमि के रूप में सेट करता है, तो निर्भर करता है)।

editMenuItem = menu.findItem(R.id.action_edit); 
    menuItemEdit_ScaleDrawable = (ScaleDrawable) editMenuItem.getIcon(); 
    //when playing with scaleDrawable always initialize the level 
    menuItemEdit_ScaleDrawable.setLevel(10000); 

मैं ScaleDrawable का उपयोग करते हैं एनीमेशन कि drawable के आकार में परिवर्तन चल रहा है: एक MenuItem के लिए, कोड की तरह दिखता है। आपके उपयोग के लिए, मैं निश्चित रूप से घटक के आकार को प्रबंधित करना पसंद करता हूं न कि घटक द्वारा प्रदर्शित ड्रायबल।

0

ScaleDrawable न केवल यह भी आप ScaleDrawable पर ही पैमाने setLevel का उपयोग कर नियंत्रित करने के लिए अनुमति देता है, तो आप एक drawable पैमाने पर करने की अनुमति देता है। लेकिन ScaleDrawable आंतरिक चौड़ाई और drawable की ऊंचाई परिवर्तन नहीं करता है के रूप में @ m039 ने कहा, ScaleDrawable स्रोत वास्तव में एक अजीब बात यह है: जब मूल drawable के स्तर को 0 पर सेट किया जाता है, scaleDrawable ही नहीं दे पाएंगे।

पैमाने के प्रभाव में लाने के लिए, आप कुछ इस तरह करना है:

ScaleDrawable scaleDrawable = (ScaleDrawable) imageView.getDrawable(); 
scaleDrawable.setLevel(10000); 
or 
scaleDrawable.setLevel(5000);