【问题标题】:Custom ImageView does not fire performClick自定义 ImageView 不会触发 performClick
【发布时间】:2013-10-27 03:01:03
【问题描述】:

我有一个快门按钮,它实现了自己的监听器来处理焦点和点击事件 这里有两个方法,一个是焦点,另一个是点击。我发现这些方法都没有被调用...

我的自定义视图扩展了一个 ImageView 如下:

public class ShutterButton extends ImageView {

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

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

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

interface ShutterButtonListener
{
    public void onShutterButtonFocus(ShutterButton shutterButton,boolean pressed);
    public void onShutterButtonClick(ShutterButton shutterButton);
}

ShutterButtonListener mListener;
boolean mOldPressed;
boolean mTouchEnabled=true;

@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
    if(mTouchEnabled)
        return super.dispatchTouchEvent(ev);
    else
        return false;
}

public void enableTouch(boolean enable)
{
    mTouchEnabled=enable;
}

@Override
public void drawableStateChanged()
{
    super.drawableStateChanged();
    final boolean pressed=isPressed();
    /*
     * When pressing a physical camera button:
     * pressed(true),optional click,pressed(false)
     * Another option that we could use is:
     * pressed(true),pressed(false),optional click...
     * The second set of events occurs when the drawable state gets updated first.
     * To emulate a physical camera button,push back pressed(false) in the event queue.
     * */
    if(pressed!=mOldPressed)//indicates state change
    {
        if(!pressed)//setting to false once shutter has been clicked(true->false)
        {
            post(new Runnable(){
                @Override
                public void run()
                {
                    callShutterButtonFocus(pressed);
                }
            });
        }
        else//(false->true)clicking the shutter
            callShutterButtonFocus(pressed);
    }
    mOldPressed=pressed;
}

private void callShutterButtonFocus(boolean pressed)
{
    if(mListener!=null)
    {
        mListener.onShutterButtonFocus(this,pressed);
    }
}

public void setShutterButtonListener(ShutterButtonListener listener)
{
    mListener=listener;
}

@Override
public boolean performClick()
{
    boolean result=super.performClick();
    if(mListener!=null &&getVisibility()==View.VISIBLE)
    {
        mListener.onShutterButtonClick(this);
    }
    return result;
}
}

在使用这个ShutterButton的Activity中:

   btn_capture=(com.example.mycameraapp.ShutterButton)findViewById(R.id.btn_capture);
    btn_capture.setShutterButtonListener(this);
    btn_capture.setVisibility(View.VISIBLE);



    @Override
public void onShutterButtonFocus(ShutterButton shutterButton,
        boolean pressed) {
    // TODO Auto-generated method stub
    Log.d(TAG, "Shutter button focus called");
    switch(shutterButton.getId())
    {
        case R.id.btn_capture:
            doFocus(pressed);
            break;
    }

}

@Override
public void onShutterButtonClick(ShutterButton shutterButton) {
    // TODO Auto-generated method stub
    Log.d(TAG, "Shutter button click called");
    switch(shutterButton.getId())
    {
        case R.id.btn_capture:
            doSnap();
            break;
    }

}

此处所有代码均来自:

ShutterButton

Activity

【问题讨论】:

    标签: android onclick android-camera android-imageview android-custom-view


    【解决方案1】:

    尝试在 xml 布局中创建 clickable=true 或在您的代码中创建 setClickalbe(true)

    无论如何,使用performClick 并不是在android 中使用视图的好方法。

    【讨论】:

    • 它起作用了...谢谢... performClick 是为了在未调用 OnClickListener 的情况下用作默认行为的后备?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2023-04-04
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多