gpt4 book ai didi

java - 如何以编程方式绘制嵌套圆

转载 作者:搜寻专家 更新时间:2023-11-01 08:46:25 25 4
gpt4 key购买 nike

这里我使用layer list通过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 中动态更改颜色

这是我的自定义 View

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);

}
}

谢谢

最佳答案

当您使用 xml 时,指定的尺寸以 dp 为单位 - 与密度无关的像素。但是在您的代码绘图函数中,将实际像素作为参数,您必须考虑到这一点并自行计算适当的值。

根据您的设备声明的屏幕密度,1dp 将转换为:

  • ldpi (120 dpi) - 0.75 像素
  • mdpi (160 dpi) - 1 像素
  • hdpi (240 dpi) - 1.5 像素
  • xhdpi (320 dpi) - 2 像素
  • xxhdpi (480 dpi) - 3 像素
  • xxxhdpi (640 dpi) - 4 像素

计算真实像素的公式是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);

}
}

您可以阅读更多:

关于java - 如何以编程方式绘制嵌套圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27815308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com