gpt4 book ai didi

Android - 如何定义可配置的大小形状

转载 作者:搜寻专家 更新时间:2023-11-01 08:47:17 27 4
gpt4 key购买 nike

根据其他几篇文章中的建议,我实现了一个在应用程序中使用的圆形按钮:

circular button

它是使用 XML 选择器实现的:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- Non focused states
-->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false"
android:drawable="@drawable/big_ring_button_unfocused" />
<item android:state_focused="false" android:state_selected="true" android:state_pressed="false"
android:drawable="@drawable/big_ring_button_unfocused" />
<!-- Focused states
-->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false"
android:drawable="@drawable/big_ring_button_focused" />
<item android:state_focused="true" android:state_selected="true" android:state_pressed="false"
android:drawable="@drawable/big_ring_button_focused" />
<!-- Pressed
-->
<item android:state_pressed="true" android:drawable="@drawable/big_ring_button_pressed" />
</selector>

..._unfocused 文件的内容(其他只是改变颜色):

<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:innerRadius="@dimen/big_ring_button_inner_radius"
android:thickness="@dimen/big_ring_button_thickness"
android:useLevel="false">

<solid android:color="@color/white" />

</shape>

我想将此模板用于我应用中的所有圆形按钮,但由于按钮内的文本发生变化,因此按钮本身的大小也应发生变化。

我认为我可以通过编程方式完成此操作,所以我查看了 GradientDrawable 的文档- 那里没有更改 innerRadius 属性的方法。

目前每个圆形按钮(选择器、未聚焦、聚焦和按下)我有 4 个 XML 文件,这非常丑陋,维护起来会很麻烦。

我怎样才能使这个按钮的大小可配置(XML 或编程)?

谢谢

最佳答案

您不能以编程方式更改 innerRadius 属性,因为它仅在膨胀时从 XML 属性中读取(参见示例 this answer)。

但是,您可以通过使用自定义可绘制对象来绘制圆环,以编程方式实现或多或少相同的效果。例如:

public class RoundBorderDrawable extends GradientDrawable
{
private static final int RING_THICKNESS = 20;
private static final int PADDING = 8;
private static final int NORMAL_COLOR = Color.BLUE;
private static final int PRESSED_COLOR = Color.RED;

private Paint mPaint;

public RoundBorderDrawable()
{
mPaint = new Paint();
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(RING_THICKNESS);
mPaint.setColor(NORMAL_COLOR);
}

@Override
public boolean isStateful()
{
return true;
}

@Override
protected boolean onStateChange(int[] stateSet)
{
boolean result = super.onStateChange(stateSet);

int color = NORMAL_COLOR;
for (int i = 0; i < stateSet.length; i++)
{
if (stateSet[i] == android.R.attr.state_pressed)
color = PRESSED_COLOR;
}

if (color != mPaint.getColor())
{
mPaint.setColor(color);
invalidateSelf();
result = true;
}

return result;
}

@Override
public void draw(Canvas canvas)
{
super.draw(canvas);
int diameter = Math.min(canvas.getWidth(), canvas.getHeight()) - RING_THICKNESS - 2 * PADDING;
canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, diameter / 2, mPaint);
}
}

这将绘制一个适合 Button 尺寸的圆(我假设你想为非方形按钮绘制一个圆)。

然后只需将 RoundBorderDrawable 的新实例设置为按钮的背景(当然,本例中的常量属性可以通过构造函数或 setter 方法提供)。

关于Android - 如何定义可配置的大小形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com