मुझे नहीं लगता कि आप एक्सएमएल में ऐसा कर सकते हैं (कम से कम एंड्रॉइड में नहीं), लेकिन मैंने यहां एक अच्छा समाधान पोस्ट किया है जो दिखता है कि यह एक बड़ी मदद होगी!
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient lg = new LinearGradient(0, 0, width, height,
new int[]{Color.GREEN, Color.GREEN, Color.WHITE, Color.WHITE},
new float[]{0,0.5f,.55f,1}, Shader.TileMode.REPEAT);
return lg;
}
};
PaintDrawable p=new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(sf);
मूल रूप से, इंट सरणी आपको कई रंग स्टॉप का चयन करने की अनुमति देता है, और निम्न फ्लोट एरे परिभाषित करता है कि उन स्टॉप्स को कहां से रखा गया है (0 से 1 तक)। आप तब, जैसा कि कहा जा सकता है, बस इसे एक मानक ड्राएबल के रूप में उपयोग करें।
संपादित करें: यहां बताया गया है कि आप अपने परिदृश्य में इसका उपयोग कैसे कर सकते हैं। मान लें कि आपके पास XML में परिभाषित एक बटन है जैसे:
<Button
android:id="@+id/thebutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Press Me!"
/>
फिर आप अपने onCreate () विधि में कुछ इस तरह से डालेंगे:
Button theButton = (Button)findViewById(R.id.thebutton);
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient lg = new LinearGradient(0, 0, 0, theButton.getHeight(),
new int[] {
Color.LIGHT_GREEN,
Color.WHITE,
Color.MID_GREEN,
Color.DARK_GREEN }, //substitute the correct colors for these
new float[] {
0, 0.45f, 0.55f, 1 },
Shader.TileMode.REPEAT);
return lg;
}
};
PaintDrawable p = new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(sf);
theButton.setBackground((Drawable)p);
मैं इस समय इसका परीक्षण नहीं कर सकता, यह मेरे सिर से कोड है, लेकिन मूल रूप से केवल उन रंगों को प्रतिस्थापित करता है, या जिन्हें आप की जरूरत है, के लिए स्टॉप को जोड़ते हैं। मूल रूप से, मेरे उदाहरण में, आप हल्के हरे रंग के साथ शुरू करेंगे, केंद्र से पहले सफेद से थोड़ा फीका होगा (एक कठोर संक्रमण के बजाय एक फीका देने के लिए), सफेद से मध्यम हरे रंग में 45% और 55% के बीच में फीका, फिर से फीका मध्य हरे से गहरे हरे रंग में 55% से अंत तक। यह आपके आकार की तरह बिल्कुल नहीं लग सकता है (अभी, मेरे पास इन रंगों का परीक्षण करने का कोई तरीका नहीं है), लेकिन आप अपने उदाहरण को दोहराने के लिए इसे संशोधित कर सकते हैं।
संपादित करें: इसके अलावा, 0, 0, 0, theButton.getHeight()
ग्रेड के x0, y0, X1, y1 निर्देशांक को संदर्भित करता है। तो मूल रूप से, यह x = 0 (बाईं ओर), y = 0 (शीर्ष) पर शुरू होता है, और x = 0 तक फैला होता है (हम एक ऊर्ध्वाधर ढाल चाहते हैं, इसलिए बाएं से दाएं कोण आवश्यक नहीं है), y = ऊंचाई बटन का। इसलिए ढाल बटन के शीर्ष से 90 डिग्री के कोण पर बटन के नीचे तक जाती है।
संपादित करें: ठीक है, इसलिए मेरे पास एक और विचार है जो काम करता है, हाहा। अभी यह XML में काम करता है, लेकिन यह जावा में आकार के लिए भी उपयुक्त होना चाहिए। यह जटिल है, और मुझे लगता है कि इसे एक एकल आकार में सरल बनाने का एक तरीका है, लेकिन यह वही है जो मैंने अभी के लिए प्राप्त किया है:
green_horizontal_gradient.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners
android:radius="3dp"
/>
<gradient
android:angle="0"
android:startColor="#FF63a34a"
android:endColor="#FF477b36"
android:type="linear"
/>
</shape>
half_overlay.xml
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<solid
android:color="#40000000"
/>
</shape>
layer_list.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android"
>
<item
android:drawable="@drawable/green_horizontal_gradient"
android:id="@+id/green_gradient"
/>
<item
android:drawable="@drawable/half_overlay"
android:id="@+id/half_overlay"
android:top="50dp"
/>
</layer-list>
test.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
>
<TextView
android:id="@+id/image_test"
android:background="@drawable/layer_list"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:text="Layer List Drawable!"
android:textColor="@android:color/white"
android:textStyle="bold"
android:textSize="26sp"
/>
</RelativeLayout>
ठीक है, इसलिए मूल रूप से मैंने क्षैतिज हरे रंग की ढाल के लिए एक्सएमएल में एक आकार ढाल बनाया है, 0 डिग्री के कोण पर सेट करें, शीर्ष क्षेत्र के बाएं हरे रंग से, सही हरे रंग के लिए जा रहा है। अगला, मैंने आधा पारदर्शी ग्रे के साथ एक आकार का आयत बनाया। मुझे पूरा यकीन है कि इस अतिरिक्त फ़ाइल को देखते हुए, लेयर-लिस्ट XML में इनबिल्ट किया जा सकता है, लेकिन मुझे यकीन नहीं है कि कैसे। लेकिन ठीक है, तो लेयर_लिस्ट एक्सएमएल फ़ाइल में हैकी हिस्सा आता है। मैंने नीचे की परत के रूप में हरे रंग की ढाल लगाई, फिर दूसरी परत के रूप में आधा ओवरले डाला, ऊपर से 50dp से ऑफसेट। जाहिर है कि आप चाहते हैं कि यह संख्या हमेशा आपके दृश्य आकार का आधा हो, हालांकि, और निश्चित 50dp नहीं है। मुझे नहीं लगता कि आप प्रतिशत का उपयोग कर सकते हैं, हालांकि। वहाँ से, मैंने सिर्फ अपने test.xml लेआउट में एक TextView सम्मिलित किया, मेरी पृष्ठभूमि के रूप में layer_list.xml फ़ाइल का उपयोग किया।
टाडा!
एक और संपादित करें : मैंने महसूस किया है कि आप केवल आइटम के रूप में ड्रा करने योग्य परत सूची में आकृतियों को एम्बेड कर सकते हैं, जिसका अर्थ है कि आपको 3 अलग XML फ़ाइलों की आवश्यकता नहीं है! आप उन्हें प्राप्त करने के समान परिणाम प्राप्त कर सकते हैं:
layer_list.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list
xmlns:android="http://schemas.android.com/apk/res/android"
>
<item>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<corners
android:radius="3dp"
/>
<gradient
android:angle="0"
android:startColor="#FF63a34a"
android:endColor="#FF477b36"
android:type="linear"
/>
</shape>
</item>
<item
android:top="50dp"
>
<shape
android:shape="rectangle"
>
<solid
android:color="#40000000"
/>
</shape>
</item>
</layer-list>
आप इस तरह से जितने चाहें उतने आइटम लेयर कर सकते हैं! मैं आसपास खेलने और यह देखने की कोशिश कर सकता हूं कि क्या मुझे जावा के माध्यम से अधिक बहुमुखी परिणाम मिल सकता है।
मुझे लगता है कि यह अंतिम संपादन है ... : ठीक है, तो आप निश्चित रूप से जावा के माध्यम से स्थिति को ठीक कर सकते हैं, निम्न की तरह:
TextView tv = (TextView)findViewById(R.id.image_test);
LayerDrawable ld = (LayerDrawable)tv.getBackground();
int topInset = tv.getHeight() / 2 ; //does not work!
ld.setLayerInset(1, 0, topInset, 0, 0);
tv.setBackgroundDrawable(ld);
तथापि! यह अभी तक एक और कष्टप्रद समस्या की ओर ले जाता है जिसमें आप ड्रा करने के बाद तक TextView को माप नहीं सकते। मुझे अभी तक यकीन नहीं है कि आप इसे कैसे पूरा कर सकते हैं ... लेकिन मैन्युअल रूप से टॉपइनसेट के लिए एक नंबर डालने से काम होता है।
मैंने झूठ बोला, एक और संपादन
ठीक है, पता चला कि कंटेनर की ऊंचाई से मिलान करने के लिए इस परत को मैन्युअल रूप से कैसे अपडेट किया जाए, पूर्ण विवरण यहां पाया जा सकता है । यह कोड आपके ऑनक्रिएट () विधि में जाना चाहिए:
final TextView tv = (TextView)findViewById(R.id.image_test);
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
LayerDrawable ld = (LayerDrawable)tv.getBackground();
ld.setLayerInset(1, 0, tv.getHeight() / 2, 0, 0);
}
});
और मैं कर रहा हूँ! वाह! :)