我试图填充一个圆圈,其中包含一定颜色和宽度的笔划,以及内部的图像。
这可以很容易地用XML完成(这只是一个示例):
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<size
android:width="120dp" android:height="120dp"/>
<solid android:color="#ffff0000"/>
<stroke
android:width="3dp" android:color="#ff00ff00"/>
</shape>
</item>
<item
android:width="60dp" android:height="60dp" android:drawable="@android:drawable/btn_star"
android:gravity="center"/>
</layer-list>
我需要让上述某些属性以编程方式进行更改,因此我无法使用XML文件,但这个想法仍然相同。
事实是,我无法找到一种简单的方法来在OvalShape可绘制上绘制,就像在XML中一样。我找不到这样做的功能。
StackOverflow上有解决方案,但我找不到运行良好的解决方案。我发现只有一个是here,但它的笔划线正在被切断。
然而,我已经通过一种方式解决了这个问题,通过使用XML只为中风本身提供了部分成功:stroke_drawable.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<stroke
android:width="4dp" android:color="@android:color/white"/>
</shape>
代码:
final int strokeDrawableResId = R.drawable.stroke_drawable;
Drawable innerDrawable = ResourcesCompat.getDrawable(getResources(), ..., null);
final Drawable strokeDrawable = ResourcesCompat.getDrawable(getResources(), strokeDrawableResId, null);
ShapeDrawable biggerCircle = new ShapeDrawable(new OvalShape());
int size = ...;
biggerCircle.setIntrinsicHeight(size);
biggerCircle.setIntrinsicWidth(size);
biggerCircle.getPaint().setColor(0xffff0000);
biggerCircle.setBounds(new Rect(0, 0, size, size));
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{biggerCircle, strokeDrawable, innerDrawable});
ImageView imageView = findViewById(R.id.imageView);
imageView.setImageDrawable(layerDrawable);
它有效,但它没有完全以编程方式完成(笔划在XML中定义)。
如何将代码更改为完全编程?
编辑:我尝试了这里建议的内容,而不是为背景添加额外的drawable,因为我在一个drawable中需要它,我使用了LayerDrawable: Drawable innerDrawable = ResourcesCompat.getDrawable(getResources(), android.R.drawable.btn_star, null);
int strokeWidth = 5;
int strokeColor = Color.parseColor("#ff0000ff");
int fillColor = Color.parseColor("#ffff0000");
GradientDrawable gD = new GradientDrawable();
gD.setColor(fillColor);
gD.setShape(GradientDrawable.OVAL);
gD.setStroke(strokeWidth, strokeColor);
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{gD, innerDrawable});
ImageView imageView = findViewById(R.id.imageView);
imageView.setImageDrawable(layerDrawable);
这是有效的,但由于某种原因,可拉伸的内部(星形)正在被拉伸:
答案 0 :(得分:10)
您可以通过编程方式执行此操作
在YourActivity.XMl
中,照常设置ImageView
。
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/id1"
android:src="@mipmap/ic_launcher_round"
android:padding="15dp"/>
在MainActivity.java
ImageView iV = (ImageView) findViewById(R.id.id1);
int strokeWidth = 5;
int strokeColor = Color.parseColor("#03dc13");
int fillColor = Color.parseColor("#ff0000");
GradientDrawable gD = new GradientDrawable();
gD.setColor(fillColor);
gD.setShape(GradientDrawable.OVAL);
gD.setStroke(strokeWidth, strokeColor);
iV.setBackground(gD);
setColor
此处设置背景颜色,setStroke
设置笔触宽度和笔触颜色
我已经为颜色,宽度等创建了一些局部变量,使其更容易理解
结果
更多你增加填充,圆圈的大小会增加。