`
tudusi
  • 浏览: 1069039 次
文章分类
社区版块
存档分类
最新评论

自定义View如何响应点击事件从而刷新view

 
阅读更多

今天项目中遇到一个问题:“如何在自定义的View中添加点击事件?”

这应该是属于游戏开发中基础技能吧。


最初想到的,在onTouchEvent当中捕捉用户点击的位置,根据位置的不同来设置不同的标志,然后调用invalidate()方法来执行这个自定义view的刷新

在自定义的View类中,

@Override
public boolean onTouchEvent(MotionEvent event) {
float pointx = event.getX();
float pointy = event.getY();
// RectF(0,0,159,135); so the center point is (80,66)
if(pointy >= 66){
System.out.println("SA: you touch the Number region");
}else if(pointx < 80){
System.out.println("SA: you touch the Mail region");
// refresh view...
haveMail = true;
this.invalidate();


}else{
System.out.println("SA: you touch the Package region");
havePackage = true;
this.invalidate();
}

return super.onTouchEvent(event);
}


结果发现,根本不能及时刷新页面,因为当前view已经处于visible状态了。

对于 invalidate()方法,官方的解释是这样的:

public voidinvalidate()

Invalidate the whole view. If the view is visible,onDraw(android.graphics.Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, callpostInvalidate().


搜索关键字:“Android之View重绘”

得到重要参考资料: http://qaohao.iteye.com/blog/478314


看了半天,原来问题出在:

invalidate和postInvalidate方法需要使用android提供的handler,才能实现重绘,而在文档的说明中却只字没提,真是坑爹啊

具体是在需要重绘的地方调用handler的sendMessage方法发送消息,紧接着会os会触发handler中的handlerMessage方法,在handlerMessage方法中再调用view的invalidate或者postInvalidate方法就能实现重绘。

根据这种思路:简单处理如下:

在MyView类(extends View)中添加:

private Handler updateViewHandler = new Handler(){
public void handleMessage(Message msg){ // run in UI thread.
switch(msg.what){
case 1:
MyView.this.invalidate();
break;
}
}
};



然后再在

@Override
public boolean onTouchEvent(MotionEvent event) {
float pointx = event.getX();
float pointy = event.getY();
// RectF(0,0,159,135); so the center point is (80,66)
if(pointy >= 66){
System.out.println("SA: you touch the Number region");
}else if(pointx < 80){
System.out.println("SA: you touch the Mail region");
// refresh view...
haveMail = true;
updateViewHandler.obtainMessage(1).sendToTarget();


}else{
System.out.println("SA: you touch the Package region");
havePackage = true;

}
return super.onTouchEvent(event);
}

问题暂时解决了!!!哈哈


----------------------------------------------------

发现新的问题:

经过测试发现,当页面全是这种自定义组件时候,会发它太敏感了,轻轻一碰就响应事件了。

所以需要重新去响应它的单击事件:


解决方法:使用 GestureDetector类来处理单击事件。

GestureDetector gd = new GestureDetector(context,new LearnGestureListener());


@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return gd.onTouchEvent(event);

}


public class LearnGestureListener implements GestureDetector.OnGestureListener {

/* (non-Javadoc)
* @see android.view.GestureDetector.OnGestureListener#onDown(android.view.MotionEvent)
*/
@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return true;
}

/* (non-Javadoc)
* @see android.view.GestureDetector.OnGestureListener#onFling(android.view.MotionEvent, android.view.MotionEvent, float, float)
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return true;
}

/* (non-Javadoc)
* @see android.view.GestureDetector.OnGestureListener#onLongPress(android.view.MotionEvent)
*/
@Override
public void onLongPress(MotionEvent e) {

}

/* (non-Javadoc)
* @see android.view.GestureDetector.OnGestureListener#onScroll(android.view.MotionEvent, android.view.MotionEvent, float, float)
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return true;
}

/* (non-Javadoc)
* @see android.view.GestureDetector.OnGestureListener#onShowPress(android.view.MotionEvent)
*/
@Override
public void onShowPress(MotionEvent e) {
}

/* (non-Javadoc)
* @see android.view.GestureDetector.OnGestureListener#onSingleTapUp(android.view.MotionEvent)
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
//这里来放 处理单击事件的代码 ,把以前的代码移步到这里就行了

//.....
return true;
}

}


至此可以收工啦!





分享到:
评论

相关推荐

    自定义View Demo(实现下拉刷新)

    在导入项目后,选择合适的设备或模拟器,点击“Run”按钮即可运行应用程序,亲自体验自定义View的下拉刷新以及其他功能。 总结来说,这个“自定义View Demo(实现下拉刷新)”是一个学习自定义Android组件的宝贵...

    Android自定义View仿腾讯TIM下拉刷新View

    本篇文章将探讨如何创建一个模仿腾讯TIM应用下拉刷新效果的自定义View。这个效果的特点是,当用户下拉时,界面上的小球会随着滑动距离改变位置,并呈现出动态的动画效果。 首先,我们要定义需求。我们需要实现的...

    Android自定义View实现转盘旋转的效果

    onDraw 函数是 View 的一个关键函数,在界面刷新时会被调用,可以在这个函数中实现自定义的绘制逻辑。 在本例中,我们将实现一个自定义的转盘 View,通过继承 View 类,并重写构造函数和 onDraw() 函数。我们将使用...

    Android自定义View(验证码)

    为了增强用户体验,我们还可以添加触摸事件,使验证码在点击时自动刷新。此外,考虑添加动画效果,如文字抖动或颜色渐变,以增加视觉吸引力。 ```java @Override public boolean onTouchEvent(MotionEvent event) {...

    Android自定义View源码

    总结起来,Android自定义View涉及到视图的测量、布局、绘制、事件处理等多个环节。通过`FdjSwitchView.java`和`FdjMineInfoView.java`,我们可以学习如何构建具有特定功能的自定义组件,并结合`view_mine_info.xml`...

    android自定义View-手绘地图

    自定义ViewGroup还可以处理触摸事件,比如检测点击事件,这样可以实现地图上元素的点击交互。 6. 动画与动画效果 自定义ViewGroup还可以实现更复杂的动画效果,如平移、缩放、旋转等,为用户提供更生动的交互体验...

    android自定义view之刷新验证码

    在“android自定义view之刷新验证码”这个主题中,我们将深入探讨如何利用自定义View来实现一个可刷新的验证码显示组件。验证码通常用于验证用户身份,防止机器人或者恶意软件的自动操作,确保数据安全。 首先,...

    安卓自定义控件相关-弹幕效果自定义View随机刷新数据.rar

    开发者可能使用线程或者Handler来定期更新这个数据源,并通知自定义View进行重绘,从而实现弹幕的动态变化。 学习这个项目,开发者将掌握如何利用Android的动画API,如ObjectAnimator或ValueAnimator,来实现弹幕的...

    ViewPager加载自定义View,按钮也可以控制滑动

    3. 在自定义View中为按钮添加点击事件监听器,处理滑动和删除操作。 4. 在适配器中管理数据列表,实现删除功能。 5. 在主活动中配置ViewPager和适配器。 理解并掌握这些步骤,你就能在Android应用中灵活地使用...

    Android 自定义View (四) 视频音量调控

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。本教程将深入探讨如何实现一个自定义的音量调控View,以提供更直观、更个性化的音量控制体验。我们参考的...

    android自定义View之NotePad出鞘记

    3. **触摸事件处理**:自定义View还需要处理用户的触摸事件。通过重写`onTouchEvent(MotionEvent event)`,我们可以监听用户的点击、滑动等行为。这对于NotePad视图来说,可能需要实现翻页、选择颜色等功能。 4. **...

    带有滚动条的自定义view

    在Android开发中,创建自定义View是提升用户体验和实现复杂界面设计的重要手段。然而,当我们在自定义View时,有时需要实现类似系统默认的滚动功能,例如加入水平或垂直滚动条。由于自定义View默认并不包含滚动条,...

    自定义view实现跑马灯效果

    标题提到的"自定义view实现跑马灯效果"是指当TextView内显示的文字长度小于TextView本身长度时,无法直接实现跑马灯效果,此时需要通过自定义View来完成这一功能。 1. **自定义View的基本步骤** - 创建一个新的...

    自定义View实例

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和视觉效果的组件。...通过以上实例,我们可以掌握自定义View的基本流程和技巧,从而在项目中实现更多创新功能。

    安卓QQ相关相关-Android自定义View之高仿QQ健康.rar

    自定义View需要监听并处理MotionEvent,实现触摸事件的响应。 4. **自定义属性**:为了方便在XML布局中使用和配置,开发者需要定义自定义属性,通过 Attrs.xml 文件声明,并在View的构造函数中解析。 5. **性能...

    Android自定义View之会走动的时钟

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创意的用户界面。本教程将深入探讨如何创建一个"会走动的时钟",这不仅是一个基本的自定义View,也是一个动态更新的组件,可以实时显示...

    自定义View实现健康指数监控

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的UI组件。本项目“自定义View实现健康指数监控”即是一个这样的实例,它不仅能够展示健康指数,还可以用作通用的进度条...

    自定义View绘图

    自定义View通常涉及到重写`onDraw()`方法,使用Canvas对象进行绘制,以及处理触摸事件等。下面将详细介绍自定义View绘图的相关知识点。 一、自定义View的基本结构 1. 创建新类:首先,我们需要创建一个继承自`View...

    安卓自定义View基础-绘制点、线、矩形、圆形等

    自定义View通常还需要处理触摸事件,通过重写`onTouchEvent(MotionEvent event)`方法。例如,可以检测用户是否点击了绘制的形状。 在实际开发中,除了基本的绘图操作,我们可能还需要考虑性能优化,如使用硬件加速...

    安卓自定义View组件

    自定义View同样可以处理触摸事件。通过重写`onTouchEvent()`方法,我们可以监听手指触摸屏幕的各种动作,如ACTION_DOWN、ACTION_UP、ACTION_MOVE等。此外,还可以利用`GestureDetector`和`ScaleGestureDetector`等...

Global site tag (gtag.js) - Google Analytics