点击/触摸时具有按钮行为的自定义视图
点击/触摸时具有按钮行为的自定义视图
我创建了一个自定义的View,通常会将一个onClickListner附加到它上面。我希望它具有一些按钮的行为:如果被按下,它应该改变自己的外观,这在onDraw()方法中定义。然而,以下代码无效:
//在我的自定义View中: @Override protected void onDraw(Canvas canvas) { boolean pressed = isPressed(); //根据pressed的值进行绘制 } //创建View时: MyView.setClickable(true);
pressed始终为false,有什么问题吗?
非常感谢!
问题出现的原因是,当我们创建一个自定义的按钮,并且希望在点击时绘制出特定的效果时,我们需要在点击事件中对视图进行重新绘制。如果我们忘记在点击事件中调用invalidate()方法,就无法实现这个效果。
解决方法是,在点击事件的处理方法中调用invalidate()方法。invalidate()方法会使视图无效,并触发视图的重新绘制。这样,当用户点击按钮时,按钮的外观就会发生改变,以显示点击效果。
具体实现代码如下:
public boolean onTouch(View v, MotionEvent event) { /* 解析事件 */ this.invalidate(); return true; }
在这段代码中,我们在onTouch()方法中调用了invalidate()方法。这将使视图无效,并触发视图的重新绘制。
通过这种方式,我们可以实现自定义视图的按钮效果。当用户点击按钮时,按钮的外观会发生改变,以提供点击反馈。
问题的出现的原因是,用户想要在点击或触摸时实现类似按钮的行为,但是不想直接使用按钮。
解决方法是,考虑直接使用按钮来实现所需的功能。可以使用ToggleButton,并在xml中编写一个简短的选择器,以便在按下或未按下时指定要使用的图像。
具体解决方法可以参考以下问题:这个问题 的回答。
问题的出现原因是自定义视图中没有实现点击或触摸事件。视图没有点击事件,但可以使用触摸事件代替,所以下面的代码应该适用于您:
您的错误是您没有为自定义视图实现点击或触摸事件。视图没有点击事件,但可以使用触摸事件代替,所以下面的代码应该适用于您:
myView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch(event.getAction()){ case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_MOVE: break; } return true; } });
在这段代码中,使用`ACTION_UP`来模拟点击操作,这样就可以解决您的问题。