如何在Android中创建这个稍微复杂的可绘制XML?
如何在XML资源文件中创建此可绘制文件? 我尝试过使用一个可绘制的图层列表,但在缩放箭头资源时遇到了问题 有没有更简单的方法如何在Android中创建这个稍微复杂的可绘制XML?,android,android-drawable,Android,Android Drawable,如何在XML资源文件中创建此可绘制文件? 我尝试过使用一个可绘制的图层列表,但在缩放箭头资源时遇到了问题 有没有更简单的方法 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="oval">
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="@color/accent_blue" />
<size android:width="@dimen/circle_thermostat_diameter_large" android:height="@dimen/circle_thermostat_diameter_large" />
</shape>
</item>
<item>
<bitmap android:src="@drawable/arrow_up" android:gravity="center"/>
</item>
<!-- ... -->
</layer-list>
试试这个:
class S extends Shape {
Path path = new Path();
float size;
S(float size) {
this.size = size;
}
@Override
protected void onResize(float width, float height) {
float radius = Math.min(width, height) / 2;
path.reset();
path.moveTo(width / 2 - size, height / 2 - radius / 2);
path.rLineTo(size, -size);
path.rLineTo(size, size);
path.moveTo(width / 2 - size, height / 2 + radius / 2);
path.rLineTo(size, size);
path.rLineTo(size, -size);
}
@Override
public void draw(Canvas canvas, Paint paint) {
float w = getWidth();
float h = getHeight();
float radius = Math.min(w, h) / 2;
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLUE);
canvas.drawCircle(w / 2, h / 2, radius, paint);
paint.setStrokeWidth(size / 4);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.WHITE);
canvas.drawPath(path, paint);
}
}
示例代码(将其添加到onCreate中):
结果:
问题是:为什么使用xml?主要是为了减少代码,并提供一个简单而优雅的解决方案。理论上,您可以这样做,但上/下箭头的垂直偏移将是固定的(因此您不能将其放置在可用高度的1/4和3/4中)如果你想让它适应真实的可绘制边界,你可以使用一个带有自定义形状的可绘制形状。你认为最好只使用蓝色圆圈作为相对线的背景,然后将箭头的图像视图相应地放置在中间的文本视图中?
TextView tv = new TextView(this);
tv.setGravity(Gravity.CENTER);
float size = 128;
tv.setTextSize(size);
tv.setTextColor(Color.WHITE);
tv.setText("72");
setContentView(tv);
tv.setBackground(new ShapeDrawable(new S(size / 2)));