Android - 自动覆盖触摸/突出显示图像按钮状态

时间:2011-04-03 01:14:22

标签: android overlay imagebutton

是否可以使用ImageButton来触摸并突出显示状态,而不需要在Android上再增加2个图像资源(另外6个,考虑到h / m / ldpi)?我基本上都在寻找类似于iOS的行为,操作系统可以在按钮的触摸状态下放置半字母叠加。

我尝试在onTouch监听器中使用setColorFilter(0xFF000000, Mode.MULTIPLY),结果与我之后的结果非常接近 - 但我不确定状态处理的最佳方法是实现此目的:

  1. touchDown事件 - >更改颜色叠加。
  2. touchUp事件 - >删除颜色叠加,并执行按钮操作。
  3. 有没有更好的方法......或者有人可以帮助填补空白?

    出于几个原因,我不想使用单独的图像 - 它是一个我没有相应资产的iPhone端口,并且考虑到我有低/中/要考虑的高创意。

    谢谢!

2 个答案:

答案 0 :(得分:1)

如果您对setColorFilter(0xFF000000, Mode.MULTIPLY)感到满意,那么如何让自己成为扩展ImageButton的自定义组件?

类似的东西:

(对不起,我没有机会测试这个)

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;

public class IosImageButton extends ImageButton implements OnTouchListener
{

    public IosImageButton(final Context context, final AttributeSet attrs, final int defStyle)
    {
        super(context, attrs, defStyle);
        this.init();
    }

    public IosImageButton(final Context context, final AttributeSet attrs)
    {
        super(context, attrs);
        this.init();
    }

    public IosImageButton(final Context context)
    {
        super(context);
        this.init();
    }

    private void init()
    {
        super.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(final View view, final MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                // touchDown event -> Change color overlay. goes here
                // e.g. this.setColorFilter(0xFF000000, Mode.MULTIPLY);
                return true;

            case MotionEvent.ACTION_UP:
                // touchUp event -> remove color overlay, and perform button action.
                // e.g. this.setColorFilter(0xFF000000, Mode.MULTIPLY);
                return true;

            default:
                return false;
        }
    }
}

然后是view.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.example.IosImageButton 
        <!-- add standard ImageButton setting here -->
        />

</RelativeLayout>

答案 1 :(得分:1)

请勿使用触摸事件尝试在此类内容上显示相应的状态。你将不可避免地得到部分错误。该框架在检测用户意图方面做了很多工作(例如:用户降落但随后滑下他的手指)考虑到slop等事情。

对于ImageButton,您可以使用src属性显示图标,然后使用适当的StateListDrawable作为背景。

我创建了一个快速项目供您查看on Github

请注意,触摸状态显示在背景中,而不是前景。请参阅讨论on Google+,了解为什么Android框架工程师认为触摸反馈应该落后,而不是在前面。如果您仍希望将drawable放在前面,请参阅我的帖子on my blog