2010-06-03 21 views
11

में एक अनुकूलित ड्रायबल लागू करना मैं एंड्रॉइड में 2 डी ग्राफिक्स को पकड़ने की कोशिश कर रहा था। एक उदाहरण मैं एक कस्टम drawable को लागू करने और नीचे के रूप मेंAndroid

class myDrawable extends Drawable { 

    private static final String TAG = myDrawable.class.getSimpleName(); 
    private ColorFilter cf; 
    @Override 
    public void draw(Canvas canvas) { 


    //First you define a colour for the outline of your rectangle 

    Paint rectanglePaint = new Paint(); 
    rectanglePaint.setARGB(255, 255, 0, 0); 
    rectanglePaint.setStrokeWidth(2); 
    rectanglePaint.setStyle(Style.FILL); 

    //Then create yourself a Rectangle 
    RectF rectangle = new RectF(15.0f, 50.0f, 55.0f, 75.0f); //in pixels 


    Log.d(TAG,"On Draw method"); 
    // TODO Auto-generated method stub 
    Paint paintHandl = new Paint(); 
    // paintHandl.setColor(0xaabbcc); 
    paintHandl.setARGB(125, 234, 213, 34); 
    RectF rectObj = new RectF(5,5,25,25); 
    canvas.drawRoundRect(rectangle, 0.5f, 0.5f, rectanglePaint); 

    } 

    @Override 
    public int getOpacity() { 
    // TODO Auto-generated method stub 
    return 100; 
    } 

    @Override 
    public void setAlpha(int alpha) { 
    // TODO Auto-generated method stub 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
    // TODO Auto-generated method stub 
    this.cf = cf; 
    } 
} 

मैं पाने के लिए कोशिश कर रहा हूँ उल्लेख मेरे गतिविधि में यह दिखाने के

मैं एंड्रॉयड drawable से बढ़ा कर एक स्वनिर्धारित drawable परिभाषित किया है चाहता हूँ के रूप में इस में दिखाया गया है मेरी गतिविधि के रूप में नीचे

public class custDrawable extends Activity { 
/** Called when the activity is first created. */ 


LinearLayout layObj = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     layObj = (LinearLayout) findViewById(R.id.parentLay); 
     ImageView imageView = (ImageView) findViewById(R.id.icon2); 
     myDrawable myDrawObj = new myDrawable(); 
     imageView.setImageDrawable(myDrawObj); 
     imageView.invalidate(); 
// layObj.addView(myDrawObj, params); 

    } 
} 

दिखाया लेकिन जब मैं अनुप्रयोग मैं गतिविधि पर कोई आयत को देखने के चलाने के लिए, किसी को भी मेरी मदद कर सकते हैं? मैं गलत कहां जा रहा हूं?

उत्तर

11

आपकी समस्या getOpacity() विधि में है। 100 मान्य मूल्य नहीं है। आपको PixelFormat मान का उपयोग करना चाहिए। साथ ही, आपको अपने RectF और Paint को कन्स्ट्रक्टर में बनाना चाहिए और फिर draw() में मानों को समायोजित करना चाहिए ताकि आप इतनी सारी ऑब्जेक्ट्स न बनाएं जिन्हें कचरा एकत्र करने की आवश्यकता हो। इस तरह:

public class Square extends Drawable 
{ 
    private final Paint mPaint; 
    private final RectF mRect; 

    public Square() 
    { 
     mPaint = new Paint(); 
     mRect = new RectF(); 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     // Set the correct values in the Paint 
     mPaint.setARGB(255, 255, 0, 0); 
     mPaint.setStrokeWidth(2); 
     mPaint.setStyle(Style.FILL); 

     // Adjust the rect 
     mRect.left = 15.0f; 
     mRect.top = 50.0f; 
     mRect.right = 55.0f; 
     mRect.bottom = 75.0f; 

     // Draw it 
     canvas.drawRoundRect(mRect, 0.5f, 0.5f, mPaint); 
    } 

    @Override 
    public int getOpacity() 
    { 
     return PixelFormat.OPAQUE; 
    } 

    @Override 
    public void setAlpha(int arg0) 
    { 
    } 

    @Override 
    public void setColorFilter(ColorFilter arg0) 
    { 
    } 
} 
+0

मैंने किया केसी द्वारा उल्लिखित, लेकिन फिर भी मैं अपने विचार पर खींची गई कोई वैध सामग्री नहीं देख पा रहा हूं। – Girish

+0

कोई अन्य समस्या यह नहीं है कि ऐसा लगता है कि आपने कभी भी 'ImageView' को अपने' LinearLayout' में नहीं जोड़ा है। आपको 'layObj.addView (imageView) 'को जोड़ने की आवश्यकता है;' क्रिएट()' – CaseyB

+0

के अंत में मैंने रैखिक लेआउट में छवि दृश्य जोड़ा है, यह मूल रूप से सेट सीमाओं के साथ एक समस्या है xml में, मैंने चौड़ाई और ऊंचाई को हार्डकोड किया छवि दृश्य का, अब यह दिखा रहा है, इसलिए मेरे सेटबाउंड के साथ कुछ समस्या यह है? – Girish

0

आप getIntrinsicWidth() और getIntrinsicHeight जैसे अन्य ओवरराइड लागू करने के लिए हो सकता है()। बताने का एक तरीका यह है कि आप अपने लेआउट_विड्थ और लेआउट_हेइट को कुछ स्थिर (लेआउट_विड्थ = "42 डीआईपी" लेआउट_हेइट = "42 डीआईपी" एक्सएमएल में सेट करते हैं या अपना लेआउट सेट करते हैं यदि आप जावा लेआउट का उपयोग कर रहे हैं तो कुछ मान पर पैराम)। कुछ दृश्य प्रकार संभालते हैं इंट्रिनिक * दूसरों की तुलना में लागू नहीं होते हैं, इसलिए उन्हें आज़माएं! इसमें सीधे देखें

यदि कोई विशिष्ट चौड़ाई या ऊंचाई नहीं है तो आप लौटने की कोशिश कर सकते हैं -1। यदि समस्या हल हो गई कभी गया

हार्ड बताने के लिए है, लेकिन मैं यहाँ गूगल मदद करने के लिए अपने आप को एक कस्टम Drawable बनाने का विवरण याद कोशिश कर के माध्यम से मिला है, के साथ साथ मैं मदद करने के लिए लोगों को इससे बचने के हैं: http://xkcd.com/979/ परिवर्तन