Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式绘制嵌套圆_Java_Android_Eclipse_Stack Overflow - Fatal编程技术网

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

Java 如何以编程方式绘制嵌套圆,java,android,eclipse,stack-overflow,Java,Android,Eclipse,Stack Overflow,在这里,我使用图层列表通过XML绘制嵌套圆 感谢使用xml时,指定的尺寸以dp-密度无关像素为单位。但在代码中,绘图函数将实际像素作为参数,您必须考虑到这一点并自己计算适当的值 根据您的设备,1dp屏幕密度将转换为: ldpi 120 dpi-0.75 pix mdpi 160 dpi-1像素 hdpi 240 dpi-1.5 pix xhdpi 320 dpi-2像素 xxhdpi 480 dpi-3像素 xxxhdpi 640 dpi-4像素 计算实际像素的公式为px=dp*dpi/16

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


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

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

ldpi 120 dpi-0.75 pix mdpi 160 dpi-1像素 hdpi 240 dpi-1.5 pix xhdpi 320 dpi-2像素 xxhdpi 480 dpi-3像素 xxxhdpi 640 dpi-4像素 计算实际像素的公式为px=dp*dpi/160

你可以阅读更多:


如果要在继续使用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>
请注意,我正在转换为GradientDrawable,因为标签就是指向它的指针


感谢大家,它对我有用,请关闭它

创建一个自定义视图类,然后在那里用东西填充onDraw。那会让你走的!我已经创建了一个自定义视图,但在这种情况下嵌套的圆没有正确填充,它只是看起来模糊像素,但当我使用xml代码时,一切都可以。尝试这个例子的问题,它是绘制圆,但圆的外线和笔划都不完美,圆线和笔划均显示模糊行为@DalijaPrasnikar@Daljia-在公式px=dp*dpi/160中…dpi是设备每英寸的点数?…我们如何找到设备的dpi?我们如何将设备分类为ldpi、mdi或xdpi等。。thanks@NagaRdpi是每英寸设备的点数,您可以通过上面代码中的DisplayMetrics init方法找到它。dm.densityDpi将为您提供其所属设备类别的dpi–ldpi、mdpi。。和dm.density会给你预乘的dpi/160。要计算设备像素,请使用上面代码中的px=dp*dm.density pix方法,还可以查看@DalijaPrasnikar-感谢您的回答。它非常有用
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);

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

}
}
<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>
LayerDrawable layerDrawable = (LayerDrawable) v.getBackground();
GradientDrawable innerCircle = (GradientDrawable) layerDrawable.findDrawableByLayerId(R.id.circle_inner);
innerCircle.setColor(0xff00ff00);
<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>
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);