Lưu ý rằng tỷ lệ phần trăm gradientRadius hoạt động trong Lollipop. Nhưng nếu bạn phải hỗ trợ trước Lollipop, tôi mở rộng khi câu trả lời của @ marnaish thêm các thuộc tính XML. gradientRadius của tôi được định nghĩa là một tỷ lệ phần trăm của chiều rộng quan điểm của cha mẹ:
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);
}
}
Trong attrs.xml:
<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>
Đáng tiếc là bạn không thể tạo một drawable XML từ một lớp tùy chỉnh, vì vậy bạn có thể' Đặt nó làm android: background. Cách giải quyết là sử dụng FrameLayout để lớp nó làm nền.
<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 là thuộc tính dựa trên giá trị số nguyên. Đặt một phần trăm hoặc bất kỳ loại giá trị đo lường nào sẽ không hoạt động. Tôi biết đây không phải là câu trả lời bạn đang tìm kiếm nhưng ít nhất nó sẽ giúp thu hẹp những gì bạn đang tìm kiếm. – Sababado
Cùng một vấn đề ở đây (ít nhất là khi xem trước bố cục của tôi trong Eclipse): gradient không được áp dụng nếu bán kính được chỉ định bằng '%' hoặc '% p' –
Phần tồi tệ nhất là nó không hoạt động ngay cả khi tôi có tài nguyên số nguyên được định nghĩa ở nơi khác, và tham khảo ở đây (@ integer/gradientRadius). Dường như chỉ chấp nhận các số nguyên được mã hóa tuyệt đối. – Gunanaresh