android中的完美圆形按钮

时间:2015-03-11 16:51:49

标签: android android-layout button

我的应用中需要完美的圆形按钮。根据屏幕尺寸(布局高度)自动缩放。

我的xml文件:circle1try.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <corners
        android:radius="1000dp"
    />
    <solid
        android:color="#ff00b3ff"
    />
</shape>

我在活动布局中使用它的地方:

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="30dp"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/button1Key"
        android:typeface="monospace"
        android:textSize="20dp"
        android:background="@drawable/circle1try"
        android:textColor="#ffffffff"
        android:text="tap here"
        android:layout_gravity="center"/>
</LinearLayout>

整个LinearLayout位于另一个垂直LinearLayout,我使用layout_weight来确保布局占用的空间在所有屏幕上具有相似的比例。

这个与按钮相关的java文件的代码片段

roundButton=(Button)findViewById(R.id.button1Key);
int btnSize=roundButton.getLayoutParams().height;
roundButton.setLayoutParams(new LinearLayout.LayoutParams(btnSize, btnSize));

并且在我的应用中,根据用户的操作,我还需要更改我在同一个类中使用以下代码段的颜色。

bgShape = (GradientDrawable)roundButton.getBackground();
bgShape.setColor(Color.BLACK);

然而,我使用此过程的按钮不是一个完整的循环。 它接近圆形,但沿x轴宽。 那么如何才能得到一个可以轻松改变颜色的圆形按钮呢?

2 个答案:

答案 0 :(得分:1)

您可以使用此库: AndroidCircleButton

或 看看another answer on stackoverflow

答案 1 :(得分:0)

好的!所以基本上不能用于代码的是它甚至在绘制布局之前就缩放了形状。解决方案等待绘制布局。 最初getHeight()将返回0。 我使用了ViewTreeObserver。 现在它返回实际值。 我合并的代码片段解决了我的问题。

     ViewTreeObserver vto = player.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            roundButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            roundButton.setWidth(player.getHeight());                
            ViewGroup.LayoutParams params=roundButton.getLayoutParams();
            params.width=player.getHeight();
            roundButton.setLayoutParams(params);
        }
    });