2012-06-24 17 views
35

मैं त्रिज्या ढाल पृष्ठभूमि के साथ एक आकृति बनाने योग्य बनाने की कोशिश कर रहा हूं, जिसमें त्रिज्या है जो स्क्रीन आकार में समायोजित होगा (प्रासंगिक documentation पर एक नज़र डालें)।स्क्रीन आकार के प्रतिशत के रूप में ग्रेडियंट त्रिज्या

यह मेरा कोड है:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle" > 

    <gradient 
     android:endColor="#000" 
     android:gradientRadius="50%p" 
     android:startColor="#5d2456" 
     android:type="radial" /> 
</shape> 

लेकिन यह काम करने के लिए लग रहे हैं doens't। अगर मैं "% p" को हटा देता हूं, तो यह काम करता है, लेकिन फिर त्रिज्या स्थैतिक होगा, इस प्रकार स्क्रीन आकार में समायोजित नहीं होगा ... कोई विचार क्या गलत है?

+0

gradientRadius एक संपत्ति है जो पूर्णांक मान पर आधारित है। एक प्रतिशत या किसी भी तरह के माप मूल्य डालना काम नहीं करेगा। मुझे पता है कि यह वह जवाब नहीं है जिसे आप ढूंढ रहे हैं लेकिन कम से कम यह आप जो खोज रहे हैं उसे कम करने में मदद करेगा। – Sababado

+0

यहां एक ही समस्या है (कम से कम जब ग्रहण में मेरे लेआउट का पूर्वावलोकन करते हैं): त्रिज्या लागू नहीं किया जाता है यदि त्रिज्या '%' या '% p' –

+0

के साथ निर्दिष्ट है, सबसे बुरा हिस्सा यह है कि यह काम नहीं करता है, भले ही मेरे पास पूर्णांक संसाधन कहीं और परिभाषित किया गया है, और यहां देखें (@ पूर्णांक/gradientRadius)। ऐसा लगता है कि केवल पूर्ण हार्ड-कोडित पूर्णांक स्वीकार करते हैं। – Gunanaresh

उत्तर

0

इस पोस्ट https://stackoverflow.com/a/4943888/604504

इस तरह से आप स्क्रीन आकार को पुन: प्राप्त करने के बाद प्रतिशत की गणना कर सकते करने के लिए क्रम समान पर एक आकार drawable बना सकते हैं।

8

मैं OnDraw ओवरराइड निम्न विधि के साथ एक कस्टम दृश्य बना दी:

<yourpackage.GradientView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
बेशक

इसके लिए विशेषताएं बनानी संभव होगा:

@Override 
protected void onDraw(Canvas canvas) { 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

    int maxSize = Math.max(getHeight(), getWidth()); 
    RadialGradient gradient = new RadialGradient(
      getWidth()/2, 
      getHeight()/2, 
      maxSize, 
      new int[] {Color.RED, Color.BLACK}, 
      new float[] {0, 1}, 
      android.graphics.Shader.TileMode.CLAMP); 

    paint.setDither(true); 
    paint.setShader(gradient); 

    canvas.drawRect(0, 0, getWidth(), getHeight(), paint); 
} 

अपने लेआउट में सिर्फ देखें जोड़ने देखें, उदाहरण के लिए। एक्सएमएल के माध्यम से अनुकूलन की अनुमति देने के लिए रंग, प्रतिशत।

11

मैंने जो परीक्षण किया है, उससे % काम करता है, लेकिन जैसा कि आप उम्मीद करते हैं।
सभी

android:gradientRadius="50" 

पहले, पिक्सल 50px

android:gradientRadius="50%" 

के रूप में यदि 50% = 0.5 पिक्सल बदल जाती है के रूप में मान ले

android:gradientRadius="5000%" 

कोशिश करने लगता है और आप एक देखेंगे 50 पीएक्स त्रिज्या
%p का उपयोग एक समान परिणाम है। जाहिर है यह कुछ ऐसा है जो मुझे उम्मीद है कि भविष्य में बदल दिया जाएगा, क्योंकि इसका उपयोग उतना ही ज्यादा नहीं है जितना है। आम तौर पर एक्सएमएल आकार हटाने योग्य संसाधन अपने आकार को किसी बाहरी कंटेनर में अनुकूलित करते हैं, इस मामले में gradientRadius कंटेनर पर ध्यान दिए बिना आकार निर्धारित कर रहा है।

+7

"50000% पी" "50" जैसा ही है, जैसा कि इलोमाम्बो ने पहले कहा था, इसलिए अगर आप कुछ पठनीयता चाहते हैं तो आपको इसका इस्तेमाल नहीं करना चाहिए। – Joan

+3

एक बेहतर समाधान मूल्य-एमडीपीआई, मान-एचडीपीआई फ़ोल्डर्स का उपयोग करना होगा और विभिन्न मंद मूल्य प्रदान करेगा और उन्हें त्रिज्या मूल्य फ़ील्ड में देखें। –

5

ध्यान दें कि gradientRadius प्रतिशत लॉलीपॉप में काम करते हैं। लेकिन अगर आपको प्री-लॉलीपॉप का समर्थन करना है तो मैंने @ मार्निश के जवाब पर एक्सएमएल विशेषताओं को जोड़ दिया। ,

<declare-styleable name="RadialGradientView"> 
    <attr name="startColor" format="color|reference"/> 
    <attr name="endColor" format="color|reference"/> 
    <attr name="gradientRadiusWidthPercent" format="float"/> 
    <attr name="centerX" format="float"/> 
    <attr name="centerY" format="float"/> 
</declare-styleable> 

दुर्भाग्य से आप एक कस्टम वर्ग से एक एक्सएमएल drawable नहीं बना सकते तो आप कर सकते हैं ':

public class RadialGradientView extends View { 
    private final int endColor; 
    private final int startColor; 
    private final float gradientRadiusWidthPercent; 
    private final float centerY; 
    private final float centerX; 
    private Paint paint; 

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

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadialGradientView, 0, 0); 

     startColor = a.getColor(R.styleable.RadialGradientView_startColor, Color.RED); 
     endColor = a.getColor(R.styleable.RadialGradientView_endColor, Color.BLACK); 
     gradientRadiusWidthPercent = a.getFloat(R.styleable.RadialGradientView_gradientRadiusWidthPercent, 1); 
     centerX = a.getFloat(R.styleable.RadialGradientView_centerX, .5f); 
     centerY = a.getFloat(R.styleable.RadialGradientView_centerY, .5f); 

     a.recycle(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 

     paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     RadialGradient gradient = new RadialGradient(
       parentWidth*centerX, 
       parentHeight*centerY, 
       parentWidth*gradientRadiusWidthPercent, 
       new int[] {startColor, endColor}, 
       null, 
       android.graphics.Shader.TileMode.CLAMP); 

     paint.setDither(true); 
     paint.setShader(gradient); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawRect(0, 0, getWidth(), getHeight(), paint); 
    } 

} 

attrs.xml में: मेरा gradientRadius जनक दृश्य की चौड़ाई के प्रतिशत के रूप में परिभाषित किया गया इसे एक दृश्य के एंड्रॉइड के रूप में सेट करें: पृष्ठभूमि। पृष्ठभूमि के रूप में इसे लेयर करने के लिए फ़्रेमलाउट का उपयोग करना है।

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="100dp"> 

    <com.RadialGradientView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:centerX=".3" 
     app:centerY=".5" 
     app:endColor="#0f0" 
     app:startColor="#f00" 
     app:gradientRadiusWidthPercent=".5" 
     /> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center" 
     android:text="What's up world?"/> 
</FrameLayout> 
संबंधित मुद्दे