Автоматически изменять фон кнопки и внешний вид текста при нажатии (как iOS)? - PullRequest
5 голосов
/ 17 июня 2011

В iOS, если я устанавливаю фон кнопки для изображения, когда я нажимаю кнопку, все содержимое кнопки (включая текст) будет затенено. Могу ли я добиться того же эффекта в Android, или мне нужно использовать разные изображения для разных состояний? Кроме того, даже если я использую разные изображения для разных состояний, как сделать текст также затененным? Грязный способ - установить OnClickListener для кнопки и программно затенять текст при нажатии, но есть ли другие способы?

Ответы [ 3 ]

7 голосов
/ 29 июля 2011

Я некоторое время пытался найти решение для этого, но ничего не мог найти, поэтому я придумал довольно аккуратное решение, которое работает на всех кнопках изображения. Так же, как iOS.

  • Создайте черное, 10% прозрачное изображение и сохраните его в формате PNG. Я называю это button_pressed.png. Вы можете использовать это изображение, http://img84.imageshack.us/img84/7924/buttonpressed.png

  • Создайте чертеж, который называется чем-то актуальным, я называю это «button_pressed_layout.xml»

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android=" http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@drawable/button_pressed"  />
    </selector>
    
  • Теперь поместите изображение вашей кнопки в LinearLayout, а затем кнопку внутри LinearLayout. В кнопке используйте button_pressed_layout.xml в качестве фона.

        <LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/button_image">
            <Button
                android:id="@+id/myButtonId"
                android:text="@string/Continue"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@drawable/button_pressed_layout"
                android:textColor="#FFF"
                android:textSize="16dp" >                   
            </Button>
        </LinearLayout>
    

Вот и все!

2 голосов
/ 28 февраля 2013

Чтобы получить нажатое состояние без создания 2-го изображения кнопки, я создал OnTouchListener, чтобы изменить альфа кнопки.Это не самое красивое нажатое состояние, но оно обеспечивает эффективное автоматическое поведение.

public class PressedStateOnTouchListener implements OnTouchListener
{
    PressedStateOnTouchListener( float alphaNormal )
    {
        mAlphaNormal    = alphaNormal;
    }

    public boolean onTouch( View theView, MotionEvent motionEvent )
    {
        switch( motionEvent.getAction() ) {
            case MotionEvent.ACTION_DOWN:
                theView.setAlpha( mAlphaNormal / 2.0f );
                break;

            case MotionEvent.ACTION_UP:
                theView.setAlpha( mAlphaNormal );
                break;
        }

        // return false because I still want this to bubble off into an onClick
        return false;
    }

    private float   mAlphaNormal;
}

В своей деятельности примените этот слушатель к каждой кнопке:

Button theButton =  (Button)findViewById( R.id.my_button_id );
theButton.setOnTouchListener( new PressedStateOnTouchListener( theButton.getAlpha() ));
0 голосов
/ 17 июня 2011

Чтобы придать самой кнопке различные эффекты, я считаю, что вам нужно использовать пользовательские изображения, как показано здесь и, менее подробно здесь Что касается текста, этот пост выглядит так, будто он справится с тенью

...