मुझे गोलाकार कोनों और आंतरिक छाया के साथ एक थंबनेल दृश्य बनाने की आवश्यकता है। आम तौर पर मैं 9पैच के साथ इमेज व्यू फ्रेम बना रहा हूं, जिसने मुझे अब तक अच्छी तरह से सेवा दी है, लेकिन इस बार मुझे जिस प्रभाव की आवश्यकता है, वह छवि के शीर्ष पर आंतरिक छाया को चित्रित करने की आवश्यकता है (और न केवल इसके आसपास)। यह मुझे ImageView क्लास का विस्तार करने और ऑनड्रा() विधि को ओवरराइड करने का नेतृत्व करता है।गोलाकार कोनों और आंतरिक छाया के साथ छवि दृश्य
public class ThumbnailImageView extends ImageView {
कई ट्यूटोरियल के बाद (! धन्यवाद StackOverflow), मैं OnDraw() विधि के लिए इस कोड के साथ समाप्त हो गया:
@Override
protected void onDraw(Canvas canvas) {
if (mBitmap == null) {
return;
}
int radius = 4;
int padding = 2;
int bleed = 2;
RectF frame = new RectF(padding, padding, getWidth() - padding, getHeight() - padding);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(0xFF000000);
canvas.drawRoundRect(frame, radius, radius, mPaint);
Shader bitmapShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(0xFF000000);
mPaint.setMaskFilter(new BlurMaskFilter(bleed, Blur.INNER));
mPaint.setShader(bitmapShader);
canvas.drawRoundRect(frame, radius, radius, mPaint);
}
मैं मूल रूप से क्या कर रहा हूँ, पहले एक काले रंग की गोलाकार आयत आ रहा है और फिर इसके ऊपर एक लुप्तप्राय किनारों (BlurMaskFilter के साथ) के साथ एक गोलाकार कोनों बिटमैप ड्राइंग। mBitmap मूल्य इस तरह imageView निर्माता में आरंभ नहीं हो जाता:
mDrawable = getDrawable();
if (mDrawable != null) {
mBitmap = ((BitmapDrawable) mDrawable).getBitmap();
}
समस्या यह है कि मैं OnDraw() पूरी तरह से (कोई super.onDraw()) अधिभावी कर रहा हूँ कहा जाता है परिणाम जो मैं चाहता है , इसलिए मुझे सभी छवियों को वांछित थंबनेल आकार (जैसे 96x96) में पूर्व-स्केल करना होगा या फिर छवि के शीर्ष-बाएं कोने को खींचा जाना है।
android:id="@+id/thumb"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
ऐसा करने के लिए, मैंने सोचा कि मैं किसी भी तरह super.onDraw बुलाना चाहिए: मुझे क्या करना सक्षम होना चाहते हैं की स्केलिंग जब मैं ThumbnailImageView के लिए निम्न एक्सएमएल मान निर्दिष्ट ढांचे कर रही है सभी लाभ लेने है() प्रभाव प्राप्त करते समय मुझे एक ही समय में आवश्यकता होती है। मैंने कैनवास के लिए एक क्लिपिंग पथ जोड़कर गोलाकार आयत प्राप्त करने में कामयाब रहा है, लेकिन मुझे आंतरिक छाया जोड़ने का कोई तरीका नहीं मिल रहा है।
@Override
protected void onDraw(Canvas canvas) {
int radius = 4;
int padding = 4;
RectF frame = new RectF(padding, padding, getWidth() - padding, getHeight() - padding);
Path clipPath = new Path();
clipPath.addRoundRect(frame, radius, radius, Path.Direction.CW);
canvas.clipPath(clipPath);
super.onDraw(canvas);
// add inner shadow
}
मैं दो विकल्प देख सकते हैं::
1) ठीक से पूर्व पैमाने के लिए imageView के बिटमैप इस नए OnDraw() कोड है। लेकिन ऐसा करने के लिए सबसे अच्छी जगह कहां है? इसके निर्माता में? ऑनड्रा() विधि में जहां ढांचा ऐसा कर रहा है? क्या फ्रेमवर्क किसी भी बिटमैप का आकार बदल रहा है या प्रदर्शन के लिए खराब होने के बिना कैनवास पर स्केल की गई छवि को आकर्षित करने का कोई और तरीका है?
2) super.onDraw() अब तक चित्रकारी के शीर्ष पर आंतरिक छाया परत जोड़ने के लिए, लेकिन मैं इसे कैसे करना है इस पर विचार से बाहर हूं।
किसी भी मदद की सराहना की जाएगी।
धन्यवाद!
+1 @mykola के लिए धन्यवाद :) यहाँ – Wesley
वीडियो के लिए लिंक है http://www.youtube.com/watch?v=jF6Ad4GYjRU – mykola
@mykola ओएमजी। आपने धमाल मचाया। yt लिंक के लिए धन्यवाद !!!! – petey