2013-07-05 10 views
8

लगता है हम कस्टम ListView जो इसमें कुछ आयत बनाकर द्वारा onDraw() विधि फैली करते हैं।विशिष्ट क्षेत्र में सूची आइटम टेक्स्ट रंग ओवरले कैसे करें?

class Listpicker extends ListView { 
//..Some other methods here..// 
    @Override 
    protected void onDraw(android.graphics.Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint); 
    } 
} 

बिटमैप तैयार कांच के कुछ प्रकार जो सूचीदृश्य और कुछ ऊंचाई की चौड़ाई के बराबर चौड़ाई के साथ आयत है प्रतिनिधित्व करते हैं। मैं क्या चाहता हूं जब सूची वस्तु इस आयताकार में स्क्रॉल करे, पाठ को चित्रित करने के लिए इस्तेमाल रंग (पृष्ठभूमि और आदि के साथ सभी आइटम नहीं) को किसी अन्य रंग में बदल दिया जाएगा। इसलिए, उदाहरण के लिए, जब सूची आइटम फिट बैठता है ताकि पाठ की केवल आधा ऊंचाई glassPickerBitmap में फिट हो, सूची आइटम का बाहरी भाग अपने सामान्य रंगों में रहना चाहिए, और glassPickerBitmap के अंदर जो भाग है उसका टेक्स्ट रंग बदलना चाहिए। सूची आइटम बिना किसी पृष्ठभूमि के सरल टेक्स्ट व्यू हैं।

यह कैसे प्राप्त किया जा सकता है? शायद ColorFilter एस Paint को सौंपा गया है? पर कहा? Listview की onDraw() विधि भी जब ListView स्क्रॉल किया है कहा जाता है नहीं है ... यह अनुकूलित विचारों, उदाहरण के लिए अंदर किया जा सकता है, कि ListView के आइटम हो जाएगा? या हो सकता है कि कुछ रंग/शेडर/पता न हो कि अन्य ओवरले का उपयोग यहां किया जा सकता है, लेकिन जहां?

संपादित करें (जोड़ा छवि उदाहरण):

यहाँ वास्तविक जीवन app से कुछ फसल के उदाहरण है। 2 ListView एस हैं: बाईं ओर एक, दाईं तरफ के दूसरे। ग्लास ग्रेड आयताकार है। अब, बाएं सूची में "संयुक्त राज्य डॉलर" मुद्रा चयनित है। और मैं सही है कि रास्ते में ListView स्क्रॉल कर रहा हूँ, कि चयन डालर और अफगानी के बीच कहीं है। अब, क्या मैं चाहता हूँ, कि छोड़ दिया ListView में डालर मुद्रा (सटीक रंग बात नहीं है अब, मैं इसे कुछ सार्थक करने के लिए बाद में बदल जाएगा) और, एक ही समय में, के निचले हिस्से लाल रंग में तैयार किया जाएगा "संयुक्त राज्य डॉलर" और दाएं सूची दृश्य में "अफगान अफगानी" का शीर्ष भाग उसी लाल रंग में भी खींचा जाएगा।

यह रंग बदलते गतिशील तरीके से किया जाना चाहिए - रंग केवल पाठ का हिस्सा सूची के स्क्रॉलिंग के दौरान कांच आयत किया जा रहा है कि के लिए बदला जाना चाहिए।

* ठीक है, यूरो और डालर यहाँ विशेष नहीं मानक सियान रंग के साथ तैयार मुद्राओं कर रहे हैं। प्रश्न कम से कम सफेद रंग के साथ पाठ के बारे में है। लेकिन अगर साइयन रंग भी बदलना संभव होगा तो यह बहुत अच्छा होगा।

List example

+0

'View.setWillNotDraw' (बूलियन willNotDraw) मिलता है' 'ListView' में कहा जाता onDraw' चाहिए। चाहे वह आपको प्राप्त करने में सक्षम हो, जो आप चाहते हैं वह बहस योग्य है। हालांकि दिलचस्प सवाल है। – techiServices

+0

@Prizoff क्या आप दो चित्र (एक नियमित आइटम में से एक और ग्लास के नीचे एक आइटम के अन्य) प्रदान कर सकते हैं? – eveliotc

+0

@EvelioTarazona – Prizoff

उत्तर

3

आप उनके क्रियान्वयन वे उपयोग में बता सकते हैं के रूप में और इतने तो वे View कि तदनुसार से मेल खाता है, जो मेरे लिए यह करने के लिए सबसे आसान और सरल तरीका है अद्यतन अपने ListAdapter में एक निश्चित स्थिति अद्यतन करते हैं, लेकिन आप आधा आधा रंगीन लेख है, जो मुझे लगता है कि आप अभी भी चाहते हैं :)


http://i.imgur.com/jHvuBcL.png

तो यहाँ शायद सबसे खराब में से एक है नहीं मिलता है जवाब मैं दे दिया है, इसके बारे में खेद है, मैं शायद इस पर फिर से या आशा है कि किसी को एक बेहतर समाधान

करने के लिए आप इंगित कर सकते हैं आप में एक धुँधली डेमो देख सकते हैं करेंगे:

http://telly.com/Y98DS5

गंदा तरीका :

  • एक उचित ColorMatrixColorFilter के साथ एक Paint बनाएं, इस मैं सिर्फ desaturating कर रहा हूँ का जवाब देने के प्रयोजनों के लिए, आप सियान के लिए अपने देख पाने के लिए ColorMatrix के लिए अपने 5x4 मैट्रिक्स यह पता लगाने करना होगा। इसके अलावा आपको नीचे चित्रित करते समय स्रोत और dest को परिभाषित करने के लिए कुछ Rect एस की आवश्यकता होगी।
  • एक ऑफ स्क्रीन Bitmap और Canvas आप अपनी सूची में आकर्षित करने के लिए इस्तेमाल करेंगे जो, कि onSizeChanged में किया है बनाएं, ताकि हम उचित व्यू लेआउट मान हैं, यहाँ आप कीचड़ देख शुरू कर सकते हैं के रूप में आप के रूप में एक Bitmap में बड़ा आवंटित करने के लिए होगा आपका ListView ताकि आपको OutOfMemoryException मिल सके।
  • अवहेलना draw अपने स्क्रीन से Canvas उपयोग करें और यह करने के लिए ListView ड्रा, तो आप दिए गए Canvas कि हमेशा की तरह अपनी सूची को आकर्षित करेगा Bitmap आकर्षित कर सकते हैं करते हैं, तो सिर्फ इतना है कि Bitmap का हिस्सा है जो का उपयोग कर अलग ढंग से तैयार किया जाएगा आकर्षित करने के लिए Paint हमने पहले परिभाषित किया है, आप उन पिक्सल के लिए ओवरड्रा हो जाएंगे।
  • अंततः अपने पूर्व-निर्मित ग्लास Bitmap खींचें, मैं एक एन-पैच (9-पैच) की सिफारिश करता हूं, इसलिए यह स्केल और स्क्रीन और घनत्वों में तेज दिखता है, फिर आप उन पिक्सल के लिए अधिक ओवरड्रा प्राप्त करते हैं।

पूरे केक लगता है:

public class OverlayView extends ListView { 
    private RectF mRect; 
    private Rect mSrcRect; 
    private Paint mPaint; 

    private Canvas mCanvas; 
    private Bitmap mBitmap; 
    private float mY; 
    private float mItemHeight; 

    public OverlayView(Context context) { 
    super(context); 

    initOverlay(); 
    } 

    public OverlayView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    initOverlay(); 
    } 

    public OverlayView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

    initOverlay(); 
    } 

    private void initOverlay() { 
    // DO NOT DO THIS use attrs 
    final Resources res = getResources(); 
    mY = res.getDimension(R.dimen.overlay_y); 
    mItemHeight = res.getDimension(R.dimen.item_height); 
    // 
    mRect = new RectF(); 
    mSrcRect = new Rect(); 
    mPaint = new Paint(); 

    ColorMatrix colorMatrix = new ColorMatrix(); 
    colorMatrix.setSaturation(0); 
    mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
    super.draw(mCanvas); 
    canvas.drawBitmap(mBitmap, 0, 0, null); 

    canvas.drawBitmap(mBitmap, mSrcRect, mRect, mPaint); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 

    mRect.set(0, mY, w, mY + mItemHeight); 
    mRect.roundOut(mSrcRect); 

    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    mCanvas = new Canvas(mBitmap); 
    } 
} 

तो कहा कि, मुझे आशा है कि आप एक क्लीनर समाधान के साथ खत्म हो, भले ही आप है कि आधे से डेढ़ sexiness :)

+0

हाँ मैं मैक्स ओएस एक्स का उपयोग करता हूं ठीक मैवेरिक्स – eveliotc

+0

एक अलग बिटमैप के बजाय 'getDrawingCache()' का उपयोग करने के बारे में कैसे? –

+0

@ एसडी। हाँ, आप इसका भी उपयोग कर सकते हैं, असल में ऐसा कुछ भी करता है, बस कुछ अतिरिक्त क्विर्क के साथ आता है जैसे कि अब अधिकतम कैश आकार, खाली बिटमैप्स, कोई और उस ड्रॉइंग कैश का उपयोग भी कर सकता है और मुझे याद है कि आपको इसका उपयोग करना चाहिए सॉफ़्टवेयर परतों के लिए, इस मामले में (हमेशा नहीं) अपने स्वयं के कैश को प्रबंधित करने से आपको नियंत्रण और मन की कुछ शांति मिलती है: आप निश्चित रूप से जानते हैं कि यह आपकी गलती है;) वैसे भी जैसा कि मैंने पहले उल्लेख किया है वह गंदा है, और आपको इससे बचना चाहिए (सबसे खराब विक्रेता कभी) – eveliotc

1
नहीं मिलता है

सबसे पहले, एक अतिरिक्त बिटमैप और कैनवास रखें:

01:

class Listpicker extends ListView { 
    Bitmap bitmapForOnDraw = null; 
    Canvas canvasForOnDraw = null; 

यकीन है कि यह सही आकार है बनाओ

@override 
    protected void onSizeChanged (int w, int h, int oldw, int oldh) { 
     if (bitmapForOnDraw != null) bitmapForOnDraw.recycle(); 
     bitmapForOnDraw = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     canvasForOnDraw = new Canvas(bitmapForOnDraw); 
    } 

और जब हम सूची ड्राइंग के लिए आते हैं:

@override 
    protected void onDraw(android.graphics.Canvas realCanvas) { 
     // Put the list in place 
     super.onDraw(realCanvas); 

     // Now get the same again 
     canvasForOnDraw.drawColor(0x00000000, PorterDuff.Mode.CLEAR); 
     super.onDraw(canvasForOnDraw); 
     // But now change the colour of the white text 
     canvasForOnDraw.drawColor(0xffff00ff, PorterDuff.Mode.MULTIPLY); 

     // Copy the different colour text into the right place 
     canvas.drawBitmap(bitmapForOnDraw, glassRect, glassRect overwritePaint); 

     // finally, put the box on. 
     canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint); 
    } 
संबंधित मुद्दे