android - 将按钮添加到自定义视图

时间:2012-08-24 17:57:09

标签: android custom-component

好的,我知道这个问题在不同的问题中有所涉及,但我在这里尝试不同的方法。

这是我的自定义View类:

public class MyView extends View {
    Button mButton;

    public MyView(Context context) {
        super(context);
        mButton = new Button(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //Sets the size needed.
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        //Draws some graphics.
        canvas.restore();

        canvas.save();
            RectF boundRect = new RectF(left,top,right,bottom);
            canvas.clipRect(boundRect);
            mButton.layout(0,0,canvas.getWidth(),canvas.getHeight());
            mButton.draw(canvas);
        canvas.restore();
    }
}

这会以正确的位置和大小绘制按钮,但是,按钮看起来是透明的一半而且无法点击。有谁知道为什么以及如何解决它?

2 个答案:

答案 0 :(得分:0)

您是否在Activity中设置了OnClickListener? 您的视图未显示已单击,因为您没有为点击状态设置不同的样式。 在drawable文件夹中创建一个新的xml文件,例如black_button_style:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
    <shape>
        <solid
            android:color="#343434" />
        <stroke
            android:width="1dp"
            android:color="#171717" />
        <corners
            android:radius="3dp" />
        <padding
            android:left="3dp"
            android:top="10dp"
            android:right="3dp"
            android:bottom="10dp" />
    </shape>
</item>
<item>
    <shape>
        <gradient
            android:startColor="#343434"
            android:endColor="#171717"
            android:angle="270" />
        <stroke
            android:width="1dp"
            android:color="#171717" />
        <corners
            android:radius="4dp" />
        <padding
            android:left="3dp"
            android:top="10dp"
            android:right="3dp"
            android:bottom="10dp" />
    </shape>
</item>

在xml-layout文件中设置视图的背景:

android:background="@drawable/black_button_style"

答案 1 :(得分:0)

我不知道是否有人关注此事,但我认为将问题保持开放是不对的。 您似乎可以直接扩展View类,但您还必须实现ViewGroup实现的一些接口:

  • android.graphics.drawable.Drawable.Callback
  • android.view.KeyEvent.Callback
  • android.view.ViewManager
  • android.view.ViewParent
  • android.view.accessibility.AccessibilityEventSource

这将使按钮可以点击。

我还发现透明度来自默认的ICS Holo Dark主题,所以按钮有点透明的事实是可取的。

最终,我不想重新发明轮子,我选择扩展ViewGroup而不是View。