android 2.3问题,关于onTouchEvent,哪位大侠帮帮忙- -

android的拖拽有关问题-onTouchEvent事件 - Android当前位置:& &&&android的拖拽有关问题-onTouchEvent事件android的拖拽有关问题-onTouchEvent事件&&网友分享于:&&浏览:125次android的拖拽问题--onTouchEvent事件
要实现图片的拖拽 主要是通过onTouchEven计算好坐标事件 然后进行重绘。下面的程序是别人的,重新加载 了一次
img = BitmapFactory.decodeResource(context.getResources(), drawable); 加载一个图片在案例中专门做了一个类 进行设置。
加载图片之后 就可以进行实践判断和重绘
@Override protected void onDraw(Canvas canvas) {
//canvas.drawColor(0xFFCCCCCC);
//if you want another background color
//draw the balls on the canvas
for (ColorBall ball : colorballs) {
canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null);
public boolean onTouchEvent(MotionEvent event) {
int eventaction = event.getAction();
int X = (int)event.getX();
int Y = (int)event.getY();
switch (eventaction ) {
case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball
balID = 0;
for (ColorBall ball : colorballs) {
// check if inside the bounds of the ball (circle)
// get the center for the ball
int centerX = ball.getX() + 25;
int centerY = ball.getY() + 25;
// calculate the radius from the touch to the center of the ball
double radCircle
= Math.sqrt( (double) (((centerX-X)*(centerX-X)) + (centerY-Y)*(centerY-Y)));
// if the radius is smaller then 23 (radius of a ball is 22), then it must be on the ball
if (radCircle & 23){
balID = ball.getID();
// check all the bounds of the ball (square)
//if (X & ball.getX() && X & ball.getX()+50 && Y & ball.getY() && Y & ball.getY()+50){
// balID = ball.getID();
case MotionEvent.ACTION_MOVE:
// touch drag with the ball
// move the balls the same as the finger
if (balID & 0) {
colorballs[balID-1].setX(X-25);
colorballs[balID-1].setY(Y-25);
case MotionEvent.ACTION_UP:
// touch drop - just do things here after dropping
// redraw the canvas
invalidate();
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有今天看啥 热点:
(在ScrollView里嵌套view)重叠view里面的onTouchEvent的调用方法,ontouchevent在我前面的自定义裁剪窗口的代码中,我把裁剪的view放在了大的scrollview里,这样就出现了程序只能触发scrollview,无法操作我的裁剪窗口。所以我加了那篇博客下面最后两段代码。其实我遇到这个问题的时候是在一个scrollview里添加了一个Edittext,我限制了Edittext的高度,所以edittext里面的内容过多时会自己产生滚动条。但我怎么也无法触发edittext的滚动事件,后来查了资料就明白了。后来一直没对它做记录,现在对这个知识点做一个总结。
老规矩,先推荐博客资料,毕竟从别人那学来的知识,好东西要分享:
[Android实例] [版主原创]ScrollView嵌套ScrollView
[Android实例] [版主原创]android之ScrollView里嵌套ListView
其实这俩是一个作者,好多人也转载这个(吐槽下那些只转载不留原文地址的,太恶心)。但讲的有点罗嗦了。。其实下面有更清楚的:
Android ScrollView嵌套ScrollView滚动的问题解决办法
这个是从老外那转来的,老外网站我这打不开了。。反正讲的很简单清楚:告诉你不建议嵌套scrollview,但嵌套了也没关系,再告诉你出现问题的原因,然后给你解决方案,就两行代码而已blabla。
最后就是理解原理的关键:解决问题代码方法的说明
android 事件处理机制之requestDisallowInterceptTouchEvent
一万个赞!
好了,如果上面的你看完了,也就基本弄明白了,到这里就可以结束了。
这种情况说简单点就是上层的view的onTouchEvent和下层view的onTouchEvent重叠了,系统无法判断你想activate哪个onTouchEvent,然后系统就很蛋疼,跑程序的时候上层动一下,下层动一下,结果哪一层都动不起来(还是有小幅度偏移的)。这就是view之间的事,不限于scrollview,listView,gridView,自定义view什么的,所以标题定的也有问题,说白了就是view的嵌套。但为了文章能被更多的搜索到,我就是不改标题(什么心态)。
&当有多个层级的View时,在父层级允许的情况下,这个action会一直向下传递直到遇到最深层的View。所以touch事件最先调用的是最底层View的onTouchEent&
注意,允许,怎么设置是否允许呢?另外运行程序的时候的确是明显的,下层view先动,上层view后动,估计默认下父层级都是允许把消息传到最下层的吧。
&如果View的onTouchEvent接收到某个touch action并作了相应处理,最后有两种返回方式return true和return false;return true会告诉系统当前的View需要处理这次的touch事件,以后的系统发出的ACTION_MOVE,ACTION_UP还是需要继续监听并接收 的,而且这次的action已经被处理掉了,父层的View是不可能触发onTouchEvent了&
了解一下onTouchEvent的返回值的用途
&所以每一个action最多只能有一个onTouchEvent接口返回true&
多层(&2)情况需要考虑一下
&如果return false,便会通知系统,当前View不关心这一次的touch事件,此时这个action会传向父级,调用父级View的onTouchEvent。 但是这一次的touch事件之后发出的任何action,该View都不会再接受,onTouchEvent在这一次的touch事件中再也不会触发,也就是说一旦View返回false,那么之后的ACTION_MOVE,ACTION_UP等ACTION就不会在传入这个View,但是下一次 touch事件的action还是会传进来的。&
这里不太明白。代码里return是在最后一行,所以会先执行前面的ACTION_*吧,return true的话,aiction执行之后再返回true,上层不再响应event可以理解,但false的话,他应该都执行过了啊?再给上层执行?
看了下源码,view的源码里onTouchEvent有一个int型的flag,在action触发前会做个判断,但自己复写方法的话。。。我怎么觉得好奇怪。。再想想。。这里面原理多呢。。
1 public boolean onTouchEvent(MotionEvent event) {
final int viewFlags = mViewF
if ((viewFlags & ENABLED_MASK) == DISABLED) {
if (event.getAction() == MotionEvent.ACTION_UP && (mPrivateFlags & PFLAG_PRESSED) != 0) {
setPressed(false);
// A disabled view that is clickable still consumes the touch
// events, it just doesn't respond to them.
return (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
if (mTouchDelegate != null) {
if (mTouchDelegate.onTouchEvent(event)) {
return true;
if (((viewFlags & CLICKABLE) == CLICKABLE ||
(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_CANCEL:
32             ...
case MotionEvent.ACTION_MOVE:
return true;
return false;
&在父层级允许的情况下。假设不改变父层级的dispatch方法,在系统调用底层onTouchEvent之前会先调用父View的onInterceptTouchEvent方法判断,父层View是不是要截获本次touch事件之后的action。&
看到这里,前面的疑惑有点头绪,再看源码&
明天画个流程图出来
&如果onInterceptTouchEvent返回了true,那么本次touch事件之后的所有action都不会再向深层的View传递,统统都会 传给负层View的onTouchEvent,就是说父层已经截获了这次touch事件,之后的action也不必询问 onInterceptTouchEvent,在这次的touch事件之后发出的action时onInterceptTouchEvent不会再次调 用,知道下一次touch事件的来临。如果onInterceptTouchEvent返回false,那么本次action将发送给更深层的View, 并且之后的每一次action都会询问父层的onInterceptTouchEvent需不需要截获本次touch事件。只有ViewGroup才有 onInterceptTouchEvent方法,因为一个普通的View肯定是位于最深层的View,touch事件能够传到这里已经是最后一站了,肯 定会调用View的onTouchEvent。&
这段大概看看吧,前面基本了解了。
&对于底层的View来说,有一种方法可以阻止父层的View截获touch事件,就是调用 getParent().requestDisallowInterceptTouchEvent(true);方法。一旦底层View收到touch的 action后调用这个方法那么父层View就不会再调用onInterceptTouchEvent了,也无法截获以后的action。&
最后的关键方法,就用这个方法即可实现功能~(但最好要先搞懂原理)
最后贴个最早发现这个问题的代码,scrollview里的edittext,touch子view就设置其属性true,touch父view就帮子view设置属性false即可~
1     mEssay.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
mScrollView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
mEssay.getParent().requestDisallowInterceptTouchEvent(false);
return false;
pager.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int arg0) {
public void onPageScrolled(int arg0, float arg1, int arg2) {
mPager.getParent().requestDisallowInterceptTouchEvent(true);
public void onPageScrollStateChanged(int arg0) {
自定义ScrollView,并重写其onTouchEvent和dispatchTouchEvent方法,以解决viewflipper 与scrollview的手势冲突,不多说直接来代码:import android.content.Cimport android.util.AttributeSimport android.view.GestureDimport android.view.MotionEimport android.widget.ScrollV/** * 自定义ScrollView,并重写其onTouchEvent和dispatchTouchEvent方法, * 以解决viewflipper 与scrollview的手势冲突 * @author yangjiantong * */public class MyScrollView extends ScrollView { GestureDetector gestureD public MyScrollView(Context context) { super(context); // TODO Auto-generated constructor stub } public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public MyScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public void setGestureDetector(GestureDetector gestureDetector) { this.gestureDetector = gestureD } @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub super.onTouchEvent(ev); return gestureDetector.onTouchEvent(ev); } @Override public boolean dispatchTouchEvent(MotionEvent ev){ gestureDetector.onTouchEvent(ev); super.dispatchTouchEvent(ev); } }
相关搜索:
相关阅读:
相关频道:
Android教程最近更新关于onTouchEvent的问题_android开发吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:110,344贴子:
关于onTouchEvent的问题收藏
我想判断用户是否触摸屏幕,也就是等待用户触屏然后再执行之后的代码,该怎么做求解???
上海android开发,汇道IT培训「实力教学」大专以上学员,0元入学,理论+实操,120天精通!汇道专注于上海android开发,名师授课,小班教学,可免费试听,火热报名中,赶紧申请!
创建一个监听器
郁闷,获取触摸坐标,先让他们等于零,如果改变说明按了,松开再让他等于0
event.getAction() ==MotionEvent.ACTION_UP代表着 手指离开了触摸屏幕,既可以开始你的事件了event.getAction() ==MotionEvent.ACTION_DOWN代表着 手指按下到屏幕上event.getAction() ==MotionEvent.ACTION_MOVE代表 手指在屏幕上滑动
楼主加油   (。ˇε ˇ。)我的小尾巴仅仅是凑够十五字而已
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 android 2.3 的文章

 

随机推荐