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

2024-02-07

这里我使用图层列表通过 XML 绘制嵌套圆

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

}
}

Thanks


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

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

  • LDPI (120 dpi) - 0.75 像素
  • mdpi (160 dpi) - 1 像素
  • 高清 (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);

}
}

您可以阅读更多内容:

  • 支持多屏 http://developer.android.com/guide/practices/screens_support.html
  • Android 中 px、dp、dip 和 sp 之间的区别? https://stackoverflow.com/questions/2025282/difference-between-px-dp-dip-and-sp-in-android
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式绘制嵌套圆 的相关文章

随机推荐