web-dev-qa-db-ja.com

Androidクリックすると画像ボタンが強調表示されます

ImageButtonを使用しています。しかし、クリックするとハイライトが表示されません。私はグーグルし、多くの人は別の画像が表示されるセレクタを使用することを提案しました。これを回避する方法はありますか? 1つの画像のみを使用して強調表示するか、グロー効果を与えます。ユーザーがそのボタンがクリックされたことを知るため。

19
Droidme

これは実際にはそれほど難しくありません。 2つの別々の.pngファイルなどを作成する必要さえありません。たとえば、グラデーションのあるボタンを作成し、ボタンを押したときにボタンを変更する場合は、次のようにします。

ステップ1:デフォルトのボタングラデーションを作成する(drawable/default_button.xml):

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:shape="rectangle">
    <corners Android:radius="3dp" />
    <gradient Android:endColor="#8ba0bb" Android:startColor="#43708f" Android:angle="90" />
    <stroke Android:width="1dp" Android:color="#33364252" />
</shape>

ステップ2:デフォルトのボタンが押されたグラデーションを作成する(drawable/default_button_pressed.xml):

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:shape="rectangle">
    <corners Android:radius="3dp" />
    <gradient Android:endColor="#43708f" Android:startColor="#8ba0bb" Android:angle="90" />
    <stroke Android:width="1dp" Android:color="#33364252" />
</shape>

ステップ3:セレクターを作成(drawable/default_button_selector.xml):

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item Android:state_pressed="true" Android:drawable="@drawable/default_button_pressed" /> 
    <item Android:drawable="@drawable/default_button" /> 
</selector>

ステップ4 (オプション):ボタンのスタイルを作成します(values/style.xml):

<resources>
    <style name="DefaultButton">
        <item name="Android:layout_width">wrap_content</item>   
        <item name="Android:layout_height">wrap_content</item>
        <item name="Android:background">@drawable/default_button_selector</item>
    </style>
</resources>

手順5:ボタン(layout/main.xml)を使用します。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
  Android:layout_width="fill_parent" Android:layout_height="fill_parent">

    <button style="@style/DefaultButton" />

</RelativeLayout>

ご覧のとおり、それを行うことは特に難しくありません。

30
Zack Marrapese

複数の画像(押された画像、通常の画像など)を作成する必要がなく、セレクタを作成する必要もありません。 setOnClickListenerではなくsetOnTouchListenerを使用します。以下のコードは、クリックされたアイテムに灰色のオーバーレイを提供します。

 ((ImageButton)findViewById(R.id.myImageBtn)).setOnTouchListener(new OnTouchListener() {

      @Override
        public boolean onTouch(View v, MotionEvent event) {
          switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN: {
              ImageButton view = (ImageButton ) v;
              view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
              v.invalidate();
              break;
          }
          case MotionEvent.ACTION_UP:

              // Your action here on button click

          case MotionEvent.ACTION_CANCEL: {
              ImageButton view = (ImageButton) v;
              view.getBackground().clearColorFilter();
              view.invalidate();
              break;
          }
          }
          return true;
        }
    });
19

なんとかやった!まず、ドローアブルフォルダーでbuttonStyle.xmlを宣言します。

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item
      Android:state_focused="true"
      Android:state_pressed="true"
      Android:drawable="@drawable/button_pressed" />

  <item
      Android:state_focused="false"
      Android:state_pressed="true"
      Android:drawable="@drawable/button_pressed" />

  <item Android:drawable="@drawable/button_normal" />
</selector>

次に、描画可能フォルダにbutton_pressed.xmlを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle" >
  <solid Android:color="@color/semiTransparentGnfrBlueColor" />
  <stroke Android:width="10dp" Android:color="@Android:color/transparent" />
</shape>

その後、button_normal.xmlをドローアブルフォルダーに作成します。

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:innerRadiusRatio="3"
  Android:shape="rectangle">
  <solid Android:color="@color/gnfrBlueColor"/>
  <stroke Android:width="10dp" Android:color="@Android:color/transparent" />
</shape>

デフォルトの色を使用できますが、私のようにしたい場合は、値フォルダーにcolors.xmlという名前のファイルが必要で、この値は内部にあります。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="gnfrBlueColor" type="color">#2A3748</item>
  <item name="semiTransparentGnfrBlueColor" type="color">#602A3748</item>
<integer-array name="androidcolors">
<item>@color/gnfrBlueColor</item>
    <item>@color/semiTransparentGnfrBlueColor</item>
  </integer-array>
</resources>

最後に、これをボタンなどに設定します。

savedAccountLoginButton.SetBackgroundResource(Resource.Drawable.buttonStyle);

注意色を透明にしたストロークを設定します。これは、backgroundresourceを設定すると、ボタンが大きくなり、このトリックを使用しても元の状態が維持されるためです。

これは、これをプログラムでアーカイブできる唯一の方法です。

これをXMLで行いたい場合:

<Button
            Android:text="ENTRAR"
            Android:layout_width="match_parent"
            Android:layout_height="60dp"
            Android:background="@drawable/buttonstyle"
            Android:textColor="@color/white"
            Android:textSize="18sp"
            Android:id="@+id/button1" />
2
Dayo

ボタンごとに複数のドローアブルを設定する必要がないように、オンタッチリスナーで画像ボタンのカラーフィルター属性を設定します。

別の投稿でここにコードを参照してください:

https://stackoverflow.com/a/14278790/891479

2
L. G.

単純にAndroid:foregroundViewをクリックして、クリック可能な効果を実現します。

Android:foreground="?android:attr/selectableItemBackground"


ダークテーマで使用する場合は、themelayoutに追加します(クリック可能な効果を明確にするため):

Android:theme="@Android:style/ThemeOverlay.Material.Dark"
0
Francis