Android自定义组件视图w/圆角
Android自定义组件视图w/圆角
我正在尝试创建一个带有圆角(和自定义背景颜色)的View,我希望能够在不同的背景颜色下重复使用;很难解释,所以这是我的代码:
/app/src/com/packagename/whatever/CustomDrawableView.java
package com.packagename.whatever; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.PaintDrawable; import android.util.AttributeSet; import android.view.View; public class CustomDrawableView extends View { private PaintDrawable mDrawable; int radius; private void init(AttributeSet attrs) { TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.RoundedRect); radius = a.getInteger(R.styleable.RoundedRect_radius, 0); } public CustomDrawableView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); mDrawable = new PaintDrawable(); } protected void onDraw(Canvas canvas) { mDrawable.setCornerRadius(radius); mDrawable.draw(canvas); } }
这是显示自定义组件的XML:
/app/res/layout/test.xml
我想要红色框有50像素的圆角,但是如你所见,它没有:
这个想法是,我可以在XML中轻松更改背景颜色,并自动获得一个带有圆角的漂亮视图,而无需创建多个可绘制对象。
感谢帮助!
在Android中,当我们想要为自定义组件视图添加圆角时,可能会遇到以下问题。以下是问题的出现原因和解决方法。
问题原因:
问题出现的原因是我们想要为自定义组件视图添加圆角,但是我们可能不知道如何实现。
解决方法:
我们可以通过以下步骤来解决这个问题:
1. 首先,我们可以创建一个简单的ShapeDrawable,代码如下:
public ShapeDrawable Sd(int s){ float[] outerR = new float[] { 12, 12, 12, 12, 12, 12, 12, 12 }; ShapeDrawable mDrawable = new ShapeDrawable(new RoundRectShape(outerR, null,null)); mDrawable.getPaint().setColor(s); return mDrawable; }
其中,上述代码中的"12"表示圆角的半径。
2. 然后,我们可以将创建的ShapeDrawable应用于任何视图的背景。例如,我们可以将其应用于LinearLayout的背景,代码如下:
LinearLayout l=(LinearLayout) findViewById(R.id.testLayout); l.setBackgroundDrawable(Sd(0xff74AC23));
其中,"testLayout"是LinearLayout的ID,"0xff74AC23"是背景颜色。
3. 如果我们已经对按钮进行了颜色设置,并且需要将按钮的角变成圆角,我们可以使用以下代码:
Resources res = this.getResources(); button2.setBackgroundDrawable(this.Sd(res.getColor(R.color.color1x2)));
其中,"button2"是按钮的ID,"R.color.color1x2"是颜色资源。
通过以上步骤,我们可以实现在Android自定义组件视图中添加圆角的效果。
问题的出现原因:没有正确设置自定义组件的圆角和颜色。
解决方法:在背景绘制中设置圆角和颜色。以下是一种可行的方法。首先获取在android:background中设置的颜色,然后使用这个颜色创建一个新的drawable,并在构造函数中将其设置为背景。只要将android:background设置为颜色值,这种方法就能够正常工作。
public CustomDrawableView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); // 获取背景颜色 int color = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "background", 0xffffffff); // 创建新的背景drawable,并设置颜色和半径,然后设置为背景 mDrawable = new PaintDrawable(); mDrawable.getPaint().setColor(color); mDrawable.setCornerRadius(radius); setBackgroundDrawable(mDrawable); }
如果重写了onDraw方法,请确保首先调用super.onDraw(canvas)以绘制背景。