android - 具有点击功能的自定义图像按钮

标签 android android-layout android-imagebutton

我知道这是一个愚蠢的问题,但谷歌搜索并没有给我一个好的答案。我的 Activity 中有一个按钮,但是当我按下它时,我看不到它。虽然按钮工作得很好。我知道我必须在 xml 文件中做一些事情,但我不确定是什么。有没有一种方法可以自动让图像按钮发生轻微变化,而无需我手动上传两张图片?

最佳答案

import android.content.Context;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.LightingColorFilter;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet;
import android.widget.Button;

/**
 * Applies a pressed state color filter or disabled state alpha for the button's background
 * drawable.
 *
 * @author shiki
 */
public class SAutoBgButton extends Button {

  public SAutoBgButton(Context context) {
    super(context);
  }

  public SAutoBgButton(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public SAutoBgButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  public void setBackgroundDrawable(Drawable d) {
    // Replace the original background drawable (e.g. image) with a LayerDrawable that
    // contains the original drawable.
    SAutoBgButtonBackgroundDrawable layer = new SAutoBgButtonBackgroundDrawable(d);
    super.setBackgroundDrawable(layer);
  }

  /**
   * The stateful LayerDrawable used by this button.
   */
  protected class SAutoBgButtonBackgroundDrawable extends LayerDrawable {

    // The color filter to apply when the button is pressed
    protected ColorFilter _pressedFilter = new LightingColorFilter(Color.LTGRAY, 1);
    // Alpha value when the button is disabled
    protected int _disabledAlpha = 100;

    public SAutoBgButtonBackgroundDrawable(Drawable d) {
      super(new Drawable[] { d });
    }

    @Override
    protected boolean onStateChange(int[] states) {
      boolean enabled = false;
      boolean pressed = false;

      for (int state : states) {
        if (state == android.R.attr.state_enabled)
          enabled = true;
        else if (state == android.R.attr.state_pressed)
          pressed = true;
      }

      mutate();
      if (enabled && pressed) {
        setColorFilter(_pressedFilter);
      } else if (!enabled) {
        setColorFilter(null);
        setAlpha(_disabledAlpha);
      } else {
        setColorFilter(null);
      }

      invalidateSelf();

      return super.onStateChange(states);
    }

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

}

要使用它,只需像这样替换原来的按钮声明:

<Button
  android:layout_width="wrap_content" android:layout_height="wrap_content"
  android:background="@drawable/button_blue_bg"
  android:text="Button with background image" />

这样做:

<com.buttondemo.SAutoBgButton
  android:layout_width="wrap_content" android:layout_height="wrap_content"
  android:background="@drawable/button_blue_bg"
  android:text="Button with background image" />

这是使用此自定义按钮的示例输出:

希望它有用

enter image description here

关于android - 具有点击功能的自定义图像按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23319264/

相关文章:

Android AppWidget 垂直滑动 - 如何

android - 如何设置应用程序的 ImageButton 属性 :srcCompat ="@drawable/pic" programmatically?

android - 将源添加到弹出菜单

java - 如何接收十六进制的套接字输入?

java - 初学者 Android : ListView to affect the next class

android - 在分隔的工具栏中具有onClick的ImageButton

java - 数据绑定(bind)事件监听器

android - 动态用户界面主题

工作项目上的 Android ClassNotFoundException( eclipse 前崩溃)

android - ItemClick 上的 ListFragment