Android圆圈背景变成椭圆形
Posted
技术标签:
【中文标题】Android圆圈背景变成椭圆形【英文标题】:Android circle background becomes oval 【发布时间】:2013-09-28 03:53:00 【问题描述】:我想在文本视图上放置一个圆形背景。圆形在渲染时变为椭圆形。
我的布局 XML:
<TextView
android:id="@+id/amount_key"
android:layout_weight="1"
android:layout_
android:layout_
android:layout_marginRight="2dp"
android:gravity="center"
android:background="@drawable/circle"
android:layout_marginLeft="20dp"
android:text="3\ndays"
android:padding="20dp"
android:textColor="#ffffff"
android:textStyle="bold"
android:textSize="25dp" />
</LinearLayout>
我的圈子背景:
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="#79bfea"/>
</shape>
【问题讨论】:
我认为您应该将 layout_weight 和 layout_height 设置为固定值。 @sudhasri 下面的解决方案不起作用? 我做到了,我通过扩展 TextView 将宽度也设置为高度来覆盖 onMeasure 【参考方案1】: 将您的textView
的layout_height
和layout_width
更改为wrap_content
在形状标签内添加尺寸标签,如下所示
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">> <solid android:color="#79bfea" /> <size android: android:/> </shape>
如果仍然是椭圆形,请尝试增加 size 标签的宽度和高度。它对我有用!
【讨论】:
在我的情况下,layout_height
和 layout_width
到 wrap_content
并调整 rigth 填充就可以了。
@GueorguiObregon 文本是否居中?【参考方案2】:
您可以创建自己的 Drawable,它将半径限制在其宽度和高度之间的最小值。
package com.example.android;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
public class ColorCircleDrawable extends Drawable
private final Paint mPaint;
private int mRadius = 0;
public ColorCircleDrawable(final int color)
this.mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
this.mPaint.setColor(color);
@Override
public void draw(final Canvas canvas)
final Rect bounds = getBounds();
canvas.drawCircle(bounds.centerX(), bounds.centerY(), mRadius, mPaint);
@Override
protected void onBoundsChange(final Rect bounds)
super.onBoundsChange(bounds);
mRadius = Math.min(bounds.width(), bounds.height()) / 2;
@Override
public void setAlpha(final int alpha)
mPaint.setAlpha(alpha);
@Override
public void setColorFilter(final ColorFilter cf)
mPaint.setColorFilter(cf);
@Override
public int getOpacity()
return PixelFormat.TRANSLUCENT;
然后应用到你的 textView:
textView.setBackground(new ColorCircleDrawable(Color.RED));
【讨论】:
要得到一个圆环而不是一个实心圆,使用paint.setStyle(Paint.Style.STROKE)和paint.setStrokeWidth(strokeWidth)。 确保像这样传递颜色: int colorToUse = ContextCompat.getColor(getContext(), R.color.my_color); textView.setBackground(new ColorCircleDrawable(colorToUse));而不是 textView.setBackground(new ColorCircleDrawable(R.color.my_color));【参考方案3】:得到这个
我在彼此内部使用了两个 LinearLayout 并将父重力设置为 CENTER
<LinearLayout
android:layout_
android:layout_
android:baselineAligned="false"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:gravity="center"
android:background="@drawable/oval"
android:orientation="vertical">
<TextView
android:layout_
android:layout_
android:layout_gravity="center"
android:text="Text"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
这是可绘制文件夹中的椭圆形.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#393939" />
<size
android:
android: />
</shape>
没有内部 LinearLayout 你会得到这个
它的代码是什么
<LinearLayout
android:layout_
android:layout_
android:baselineAligned="false"
android:gravity="center"
android:background="@drawable/oval"
android:orientation="vertical">
<TextView
android:layout_
android:layout_
android:layout_gravity="center"
android:text="Text"
android:textSize="12sp" />
</LinearLayout>
【讨论】:
【参考方案4】:我扩展了 TextView 类以将宽度设置为高度
public class TextViewSquareShaped extends TextView
public TextViewSquareShaped(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
init(attrs);
public TextViewSquareShaped(Context context, AttributeSet attrs)
super(context, attrs);
init(attrs);
public TextViewSquareShaped(Context context)
super(context);
init(null);
private void init(AttributeSet attrs)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
int width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
setMeasuredDimension(width, width);
Log.v("measure", "width:" + width + " height:" + width);
然后结合上面 Sudhasri 的回答,我可以显示精确的圆形文本视图。
所以不需要给出固定的身高和体重。
【讨论】:
java.lang.IllegalArgumentException: width and height must be > 0
【参考方案5】:
由于您使用match_parent
作为宽度和高度并在背景中设置可绘制,所以它将是椭圆形的。要实现圆形,您可以为宽度和高度提供相同的尺寸。 NA 如果想要全屏,那么您可以使用 WindowManager
从 java
代码中调整宽度,并在宽度和高度上设置相同的值。
【讨论】:
【参考方案6】:用环形代替椭圆形
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring" >
<solid android:color="#79bfea" />
</shape>
【讨论】:
以上是关于Android圆圈背景变成椭圆形的主要内容,如果未能解决你的问题,请参考以下文章