这里我使用图层列表通过XML
绘制嵌套的Circle
<item>
<shape android:shape="oval" >
<stroke
android:width="1dp"
android:color="@android:color/holo_orange_light" />
<padding
android:bottom="7dp"
android:left="7dp"
android:right="7dp"
android:top="7dp" />
</shape>
</item>
<item>
<shape android:shape="oval" >
<solid android:color="@color/welcome_bg" />
</shape>
</item>
不,我想通过编程方式使用相同的嵌套圆,因为我想动态更改颜色,或者有没有办法在上面提供的xml中动态更改颜色
这是我的自定义视图
public class MyView extends EditText {
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.GRAY);
RectF oval1 = new RectF(50, 50, 300, 300);
canvas.drawOval(oval1, paint);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
RectF oval2 = new RectF(55, 55, 295, 295);
canvas.drawOval(oval2, paint);
}
}
谢谢
答案 0 :(得分:2)
使用xml时,指定的尺寸为dp - 密度无关像素。但是在您的代码绘制函数中,将实际像素作为参数,您必须将其考虑在内并自己计算正确的值。
根据您的设备声明的屏幕密度,1dp将转换为:
计算实像素的公式为px = dp * (dpi / 160)
public class MyView extends EditText {
float mDensityScale;
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public MyView(Context context) {
super(context);
init(context, null, 0);
}
private void init(Context context, AttributeSet attrs, int defStyle)
{
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
mDensityScale = dm.density;
}
private float pix(float dp)
{
return dp * mDensityScale;
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.GRAY);
RectF oval1 = new RectF(pix(50), pix(50), pix(300), pix(300));
canvas.drawOval(oval1, paint);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
RectF oval2 = new RectF(pix(55), pix(55), pix(295), pix(295));
canvas.drawOval(oval2, paint);
}
}
您可以阅读更多内容:
答案 1 :(得分:1)
如果要在保持使用xml的同时更改可绘制颜色,可以向要修改的项目添加id:
<item>
<shape android:shape="oval" >
<stroke
android:width="1dp"
android:color="@android:color/holo_orange_light" />
<padding
android:bottom="7dp"
android:left="7dp"
android:right="7dp"
android:top="7dp" />
</shape>
</item>
<item android:id="@+id/circle_inner">
<shape android:shape="oval" >
<solid android:color="@color/welcome_bg" />
</shape>
</item>
然后在你的代码中获取图层列表drawable并搜索相关的id并更改颜色:
LayerDrawable layerDrawable = (LayerDrawable) v.getBackground();
GradientDrawable innerCircle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.circle_inner);
innerCircle.setColor(0xff00ff00);
请注意,我正在使用GradientDrawable,因为<shape>
标记是指向shape tag documentation)的指针
答案 2 :(得分:0)
<item android:id="@+id/circle_outer">
<shape android:shape="oval" >
<stroke
android:width="1dp"
android:color="@android:color/holo_orange_light" />
<padding
android:bottom="7dp"
android:left="7dp"
android:right="7dp"
android:top="7dp" />
</shape>
</item>
<item android:id="@+id/circle_inner">
<shape android:shape="oval" >
<solid android:color="@color/welcome_bg" />
</shape>
</item>
在这里,我提供了XML并设置了它们的ID并以编程方式更改颜色 XML项目颜色变化的方式
LayerDrawable layerDrawable = (LayerDrawable) ctx.getResources().getDrawable(R.drawable.tv_circle);
GradientDrawable innerCircle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.circle_inner);
GradientDrawable outerCircle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.circle_outer);
innerCircle.setColor(0xff00ff00);
outerCircle.setStroke(2, Color.BLUE, 0, 10);
感谢所有人,它对我有用,请关闭它