Android imageview-需要覆盖onShowPress行为

Android imageview-需要覆盖onShowPress行为,android,onclick,imageview,Android,Onclick,Imageview,新手问题。 我正在活动布局中使用ImageView,希望其行为与按钮类似。我注意到ImageView已经生成onClick。它没有做的是在触摸和取消触摸时提供任何视觉反馈,这是我想补充的 同时,我需要长时间的媒体处理;我还不知道ImageView是否会这样做 我深入研究了一下,发现视图实现了Runnable;当用户点击图像时,会调用performClick,然后调用ImageView.performClick,最后为所有侦听器调用onClick(这是我的活动)。当ImageView处理Perfo

新手问题。 我正在活动布局中使用ImageView,希望其行为与按钮类似。我注意到ImageView已经生成onClick。它没有做的是在触摸和取消触摸时提供任何视觉反馈,这是我想补充的

同时,我需要长时间的媒体处理;我还不知道ImageView是否会这样做

我深入研究了一下,发现视图实现了Runnable;当用户点击图像时,会调用performClick,然后调用ImageView.performClick,最后为所有侦听器调用onClick(这是我的活动)。当ImageView处理PerformClick时,更改图像外观已经太晚了;我该怎么在节目发布时间做呢

还有一点需要注意:我已经看过(并尝试过)在ImageView中添加一个gestureDetector,但似乎我需要重新实现onClick处理——无论如何,活动停止接收onClick

可能有一种完全不同的方式来做我想做的事情,我很乐意听到

谢谢

编辑: 监控触摸动作的测试代码: 包com.example.mockup

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

public class ImageGestureButton extends ImageButton
   implements View.OnTouchListener, View.OnClickListener, View.OnDragListener,
   View.OnLongClickListener
{
  public ImageGestureButton (Context context, AttributeSet attrs)
  {
    super(context, attrs);
    setOnTouchListener (this);
    setOnClickListener (this);
    setOnLongClickListener (this);
    setOnDragListener (this);
    setLongClickable (true);
  }

  public boolean onTouch (View v, MotionEvent e)
  {
    System.out.println ("onTouch " + e.getAction());
    return false;
  }

  public void onClick (View v)
  {
    System.out.println ("onClick");
  }

  public boolean onDrag (View v, DragEvent e)
  {
    System.out.println ("onDrag");
    return false;
  }

  public boolean onLongClick (View v)
  {
    System.out.println ("onLongClick");
    return false;
  }

}
我会用一个。然后使用连接您希望在单击时调用的方法。此外,还可以用于长按行为

最后,您还可以根据状态(聚焦、选定等)设置不同的背景、颜色等。请看一下文档


至于测试代码,onLongClick()返回false,这表示长时间单击没有被使用。尝试将返回值更改为true,这将阻止onClick()也被激发。此外,您还需要调用startDrag()方法来触发onDrag()事件。有关不同事件侦听器和startDrag()方法的更多信息,请参阅。

听起来您想做的是使用并扩展此方法:


它有两种状态,这也是因为它是一个视图,有OnClick和OnLongClick可用。

实际上,这是我尝试的第一件事。标准的按钮外观不适合我正在尝试做的事情-我想提供我自己的常规和“按下”的图像。正如您所说,有一种方法可以覆盖默认的按钮图像行为。我去看看。但是,我一直在尝试ImageView。尽管如此,setOnClickListener()和setOnLongClickListener()也适用于ImageView,因为它们是View的方法,ImageView的父类。此外,您还可以将ImageView的src分配给中所示的可绘制状态列表,以获得不同的状态。是一个孩子,所以他们非常相似。进步!因此,我添加了setOnClickListener、setOnLongClickListener、setOnDragListener和setOnTouchListener,并称之为setLongClickable。通过使用调试输出,我可以看到这些处理程序正在工作。我从onTouch得到的是合理的:一个“向下”,可能是一些“移动”,还有一个“向上”。不管是什么样的触摸,我总是能看到一次点击。我从来没见过昂德拉格。如果我保持几秒钟,我只看到长点击(加上一次点击)。那么,现在我该怎么做才能让onClick只在短时间内出现,为什么我看不到onDrag?(我在原来的帖子中添加了一些代码)谢谢。你的onLongClick()返回false,这表示长时间的点击没有被使用。尝试将返回值更改为true,这将阻止onClick()也被激发。此外,您还需要调用startDrag()方法来触发onDrag()事件。有关不同事件侦听器和startDrag()方法的更多信息,请参阅。非常好!谢谢你的帮助。是的,从onLongClick返回true起了作用——我没想到onClick会受到影响。很遗憾,我还没有阅读拖放文档。