如何在Android XML可绘制文件中定义圆形?
我在查找Android的XML形状定义文档时遇到了一些问题。我想在XML文件中定义一个简单的填充有纯色的圆圈,将其包含在布局文件中 遗憾的是,android.com上的文档没有涵盖Shape类的XML属性。我想我应该用一个圆来画一个圆,但是没有关于如何设置大小、颜色或角度的解释,以使一个圆弧变成一个圆。只需使用如何在Android XML可绘制文件中定义圆形?,android,android-drawable,shapes,Android,Android Drawable,Shapes,我在查找Android的XML形状定义文档时遇到了一些问题。我想在XML文件中定义一个简单的填充有纯色的圆圈,将其包含在布局文件中 遗憾的是,android.com上的文档没有涵盖Shape类的XML属性。我想我应该用一个圆来画一个圆,但是没有关于如何设置大小、颜色或角度的解释,以使一个圆弧变成一个圆。只需使用 ShapeDrawable circle = new ShapeDrawable( new OvalShape() ); 查看Android SDK示例。ApiDemos项目中有几个
ShapeDrawable circle = new ShapeDrawable( new OvalShape() );
查看Android SDK示例。ApiDemos项目中有几个例子: /ApiDemos/res/drawable/
- black_box.xml
- shape_5.xml
- 等
这是一个简单的圆圈,可以在Android中绘制
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#666666"/>
<size
android:width="120dp"
android:height="120dp"/>
</shape>
简单圆的代码
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#9F2200"/>
<stroke android:width="2dp" android:color="#fff" />
<size android:width="80dp" android:height="80dp"/>
</shape>
以下是一个简单的圆圈_background.xml,用于预材料:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="oval">
<solid android:color="@color/color_accent_dark" />
</shape>
</item>
<item>
<shape android:shape="oval">
<solid android:color="@color/color_accent" />
</shape>
</item>
</selector>
您可以使用按钮布局定义中的属性“android:background=“@drawable/circle\u background””将其设置为视图背景
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke
android:width="1dp"
android:color="#78d9ff"/>
</shape>
对于实心圆使用:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#48b3ff"/>
</shape>
带笔划的实体:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#199fff"/>
<stroke
android:width="2dp"
android:color="#444444"/>
</shape>
注意:要使椭圆形
形状显示为圆形,在这些示例中,使用此形状作为背景的视图应为正方形,或者必须将形状标记的高度
和宽度
属性设置为相等值。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- fill color -->
<solid android:color="@color/white" />
<!-- radius -->
<stroke
android:width="1dp"
android:color="@color/white" />
<!-- corners -->
<corners
android:radius="2dp"/>
</shape>
您可以按如下方式使用:
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportHeight="64"
android:viewportWidth="64">
<path
android:fillColor="#ff00ff"
android:pathData="M22,32
A10,10 0 1,1 42,32
A10,10 0 1,1 22,32 Z" />
</vector>
上述xml呈现为:
如果你想要一个这样的圆圈 请尝试使用以下代码:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadius="0dp"
android:shape="ring"
android:thicknessRatio="2"
android:useLevel="false" >
<solid android:color="@android:color/white" />
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
</shape>
由于某种原因,我无法在约束图中画一个圆,我无法使用上面的任何答案 一个简单的文本视图,当您按下“Alt+7”时,它会显示文本,这是一个完美的工作方式:
您可以试试这个-
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:innerRadiusRatio="700"
android:thickness="100dp"
android:useLevel="false">
<solid android:color="#CCC" />
</shape>
此外,您还可以通过调整android:thickness
来调整圆的半径
res/drawble/circle\u shape.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="oval">
<solid android:color="#e42828"/>
<stroke android:color="#3b91d7" android:width="5dp"/>
<!-- Set the same value for both width and height to get a circular shape -->
<size android:width="250dp" android:height="250dp"/>
</shape>
</item>
</selector>
您可以尝试使用此
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape
android:innerRadius="0dp"
android:shape="ring"
android:thicknessRatio="2"
android:useLevel="false" >
<solid android:color="@color/button_blue_two" />
</shape>
</item>
如果你在文本视图中使用它,你不必担心宽高比
Android XML可绘制文件中的圆形
截图
您可以创建自定义绘图,以动态更改圆的颜色和半径
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class CircleDrawable extends Drawable {
private Paint circlePaint;
private int fillColor;
private int strokeColor;
private float radius;
public CircleDrawable(int fillColor, int strokeColor, float radius) {
this.fillColor = fillColor;
this.strokeColor = strokeColor;
this.radius = radius;
circlePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
}
@Override
public void draw(@NonNull Canvas canvas) {
int x=getBounds().centerX();
int y=getBounds().centerY();
//draw fill color circle
circlePaint.setStyle(Paint.Style.FILL);
circlePaint.setColor(fillColor);
canvas.drawCircle(x,y,radius,circlePaint);
// draw stroke circle
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setColor(strokeColor);
circlePaint.setStrokeWidth(5);
canvas.drawCircle(x,y,radius,circlePaint);
}
@Override
public void setAlpha(int alpha) {
circlePaint.setAlpha(alpha);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
circlePaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
从UI设置此选项以获得圆形
imageView.setImageDrawable(new CircleDrawable(Color.RED,Color.YELLOW,100));
输出将如下所示
用破折号尝试以下代码:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="@dimen/_60sdp"
android:height="@dimen/_60sdp" />
<solid android:color="@color/black" />
<stroke
android:width="@dimen/_1sdp"
android:color="@color/white"
android:dashWidth="@dimen/_1sdp"
android:dashGap="@dimen/_1sdp" />
尝试不带破折号的代码
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="@dimen/_60sdp"
android:height="@dimen/_60sdp" />
<solid android:color="@color/black" />
<stroke
android:width="@dimen/_1sdp"
android:color="@color/white"
/>
我如何在XML布局文件中将其设置为ImageView的src?这不直接适用于XML布局代码,实际上是可行的。谢谢:)val background=ShapeDrawable(OvalShape())background.paint.color=ContextCompat.getColor(holder.getView().context,R.color.green)val layers=arrayOf(background,resource!!)greenRoundIcon.setImageDrawable(layerdDrawable(layers))在这里,您可以阅读有关如何创建可绘制形状的内容:您可以从这里获得圆形xml。自那时以来,Android开发文档已经得到了改进。现在它涵盖了
android:shape
element-。以及如何动态更改颜色?@AnkitGarg您可以应用Java代码中的颜色过滤器(请参见Drawable类)。我尝试了dp
,结果它被扭曲成椭圆形。对我来说,使用pt
将其修复。如果以后为视图定义正方形大小,则无需在形状中使用大小。其形状为椭圆形而不是圆形。有人能确认吗???+在形状上添加“大小”(取决于用例)。很好的解决方案。当然,如果视图的宽度和高度相同,则椭圆形显示为圆形。我认为有一种方法可以使其显示为圆形,而不管视图大小。@FerranMaylinch“我认为有一种方法可以使其显示为圆形,而不管视图大小。”我解决了这一问题,使用了一种相对的方法,即使用固定宽度/高度的ImageView(圆形为“src”可绘制)和一种包装文本的TextView包装图像视图(圆形为“src”可绘制)(例如)。我正在做完全相同的事情,但圆被绘制为椭圆形。如果我们需要它在运行时围绕具有不同边框颜色的文本视图创建什么?@AnshulTyagi我相信您可以通过调用yourView.getBackground()来实现这一点
和手动设置颜色。您需要将其转换为适当的类型,如ShapeDrawable
。关于这一点,有相关的问题。嘿,我在圆和视口之间有一个填充。您能帮我吗?@Ajeet您可以更改视口的大小,您可以将路径放在组中,并指定平移和缩放e@Riyas你能解释一下pathData部分吗?这些坐标意味着什么?在椭圆形中
有什么作用(我认为椭圆形没有角)?非常聪明!我相信有人会发现这很有用。这真的很好!由于属性不直观,这当然需要一些操作。我设法让它每次都显示一个漂亮的空白圆圈作为边框。你可以使用填充来确保整个圆圈都显示出来。这就是我想要的。谢谢
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class CircleDrawable extends Drawable {
private Paint circlePaint;
private int fillColor;
private int strokeColor;
private float radius;
public CircleDrawable(int fillColor, int strokeColor, float radius) {
this.fillColor = fillColor;
this.strokeColor = strokeColor;
this.radius = radius;
circlePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
}
@Override
public void draw(@NonNull Canvas canvas) {
int x=getBounds().centerX();
int y=getBounds().centerY();
//draw fill color circle
circlePaint.setStyle(Paint.Style.FILL);
circlePaint.setColor(fillColor);
canvas.drawCircle(x,y,radius,circlePaint);
// draw stroke circle
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setColor(strokeColor);
circlePaint.setStrokeWidth(5);
canvas.drawCircle(x,y,radius,circlePaint);
}
@Override
public void setAlpha(int alpha) {
circlePaint.setAlpha(alpha);
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
circlePaint.setColorFilter(colorFilter);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
}
imageView.setImageDrawable(new CircleDrawable(Color.RED,Color.YELLOW,100));
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="@dimen/_60sdp"
android:height="@dimen/_60sdp" />
<solid android:color="@color/black" />
<stroke
android:width="@dimen/_1sdp"
android:color="@color/white"
android:dashWidth="@dimen/_1sdp"
android:dashGap="@dimen/_1sdp" />
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="@dimen/_60sdp"
android:height="@dimen/_60sdp" />
<solid android:color="@color/black" />
<stroke
android:width="@dimen/_1sdp"
android:color="@color/white"
/>