ध्यान दें कि 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>
gradientRadius एक संपत्ति है जो पूर्णांक मान पर आधारित है। एक प्रतिशत या किसी भी तरह के माप मूल्य डालना काम नहीं करेगा। मुझे पता है कि यह वह जवाब नहीं है जिसे आप ढूंढ रहे हैं लेकिन कम से कम यह आप जो खोज रहे हैं उसे कम करने में मदद करेगा। – Sababado
यहां एक ही समस्या है (कम से कम जब ग्रहण में मेरे लेआउट का पूर्वावलोकन करते हैं): त्रिज्या लागू नहीं किया जाता है यदि त्रिज्या '%' या '% p' –
के साथ निर्दिष्ट है, सबसे बुरा हिस्सा यह है कि यह काम नहीं करता है, भले ही मेरे पास पूर्णांक संसाधन कहीं और परिभाषित किया गया है, और यहां देखें (@ पूर्णांक/gradientRadius)। ऐसा लगता है कि केवल पूर्ण हार्ड-कोडित पूर्णांक स्वीकार करते हैं। – Gunanaresh