关闭

触摸事件

108人阅读 评论(0) 收藏 举报
分类:

触摸事件,确定Dragview 的位置。

    // 對图片设置触摸侦听。
        ivDrag.setOnTouchListener(new OnTouchListener() {

            @Override
            // 正在触摸时;
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                // 获取触摸时的事件。
                switch (event.getAction()) {
                // 按下
                case MotionEvent.ACTION_DOWN:
                    // 初始化坐标起点位置。

                    startX = (int) event.getRawX();   //getRawX获得是相对screen的x坐标。
                    startY = (int) event.getRawY();

                    break;

                // 抬起 当鼠标抬起时记录下鼠标的位置。

                // 移动
                case MotionEvent.ACTION_MOVE:
                    //

                    int endX = (int) event.getRawX();
                    int endY = (int) event.getRawY();

                    // 计算偏移量。
                    int dX = endX - startX;
                    int dY = endY - startY;
                    // 计算图片的位置。
                    int l = ivDrag.getLeft() + dX;
                    int t = ivDrag.getTop() + dY;
                    int r = ivDrag.getRight() + dX;
                    int b = ivDrag.getBottom() + dY;
                    /**
                     * 对组件是否出过屏幕做出判断。
                     * 第四个参数减去20的主要的原因是titlebar  状态栏的高度。
                     */
                    if(l<0||r>winwidth||t<0||b>winHeight-20){
                        break;

                    }


                    /**
                     * 对图片的高度的判断, 以确定上下TextView的显示和隐藏。
                     */
                    if(t<winHeight/2){
                        //下面显示 上面隐藏。
                        tvTop.setVisibility(View.INVISIBLE);
                        tvBottom.setVisibility(View.VISIBLE);


                    }else{
                        //上面显示, 下面隐藏。   

                        tvTop.setVisibility(View.VISIBLE);
                        tvBottom.setVisibility(View.INVISIBLE);

                    }


                    // 更新图片的位置。
                    ivDrag.layout(l, t, r, b);

                    // 重新初始化起点坐标。
                    startX = (int) event.getRawX();
                    startY = (int) event.getRawY();

                    break;

                case MotionEvent.ACTION_UP:
                    // 手抬起时 记录住最后的位置 左边 和上边 就能确定最后的位置。
                    Editor edit = mPref.edit();
                    edit.putInt("lastX", ivDrag.getLeft());
                    edit.putInt("lastY", ivDrag.getTop());
                    edit.commit();

                    break;

                default:
                    break;
                }

                return true; // 表示这个事件自己处理不交给父类。   就是拦截事件。
            }
        });

当触摸事件发生在电话窗口位置时需要注意;

params.type = WindowManager.LayoutParams.TYPE_PHONE;  //type类型为phone类型。

需要添加权限:

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  //系统的弹窗。
view.setOnTouchListener(new OnTouchListener() {

            private int startX;
            private int startY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                switch (event.getAction()) {
                // 触摸事件, 手指按下时。
                case MotionEvent.ACTION_DOWN:

                    startX = (int) event.getRawX();
                    startY = (int) event.getRawY();

                    break;
                // 移动时,
                case MotionEvent.ACTION_MOVE:

                    int endX = (int) event.getRawX();
                    int endY = (int) event.getRawY();

                    // 偏移量:
                    int dX = endX - startX;
                    int dY = endY - startY;

                    // 更新浮窗的位置。

                    params.x += dX;
                    params.y += dY;
                    /**
                     * 在这里限制xy防止坐标偏离屏幕。
                     */

                    if(params.x<0){
                        params.x=0;
                    }
                    if(params.x>winWidth-v.getWidth()){
                        params.x=winWidth-v.getWidth();
                    }
                    if(params.y<0){
                        params.y=0;
                    }
                    if(params.y>winHeight-v.getHeight()){
                        params.y=winHeight-v.getHeight();
                    }
                    Log.e("params.x=", params.x+"");
                    Log.e("params.y=", params.y+"");

                    mwm.updateViewLayout(v, params);

                    // 重新初始化坐标。
                    int startX = (int) event.getRawX();
                    int startY = (int) event.getRawY();

                    break;

                case MotionEvent.ACTION_UP:

                    Editor edit = mPref.edit();
                    edit.putInt("lastX", params.x);
                    edit.putInt("lastY", params.y);
                    edit.commit();

                    break;

                default:
                    break;
                }

                return false;
            }
        });
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Cocos2d-x实例:单点触摸事件

为了让大家掌握Cocos2d-x中的事件机制,下面我们以触摸事件为例,使用事件触发器实现单点触摸事件。该实例如图8-3所示,场景中有三个方块精灵,显示顺序如图8-3所示,拖拽它们可以移动它们,事件响应...
  • tonny_guan
  • tonny_guan
  • 2014-07-24 20:37
  • 9162

自定义view重写触摸事件-imageview为例

package com.bdyl.view; import com.bdyl.constance.Logs; import android.content.Context; import androi...
  • qq_31116683
  • qq_31116683
  • 2016-02-17 11:50
  • 860

Android触摸事件的传递与处理

了解Android控件的触摸事件的传递与处理对我们开发中自定义控件和触摸事件的冲突解决有很大作用。我们先来看看与触摸事件相关的几个方法:   boolean dispatchTouchEvent(...
  • u011282703
  • u011282703
  • 2016-05-01 21:52
  • 627

Android触摸事件(三)-触摸事件类使用实例

触摸事件AbsTouchEvent与TouchUtils的使用 简单方便地实现界面的拖动与缩放功能
  • u011374875
  • u011374875
  • 2016-04-06 14:19
  • 2327

Android 触摸事件机制(三) View中触摸事件详解

本文将对View中触摸事件相关的内容进行介绍。重点介绍的是dispatchTouchEvent(), onTouchEvent()这两个API以及OnTouchListener接口。 注意:本文...
  • luojiayuan4523
  • luojiayuan4523
  • 2016-05-04 21:12
  • 625

cocos2dx学习之路----第九篇(深入理解单点触摸的事件机制)

上一篇我们简单接触了关于单点触摸的实现。 这一篇我们继续进一步的理解单点触摸的事件分发的优先级问题。
  • qq_30501909
  • qq_30501909
  • 2016-07-27 17:22
  • 1128

COCOS-3.X事件分发机制-触摸事件

在cocos中,触摸事件分为单点触摸和多点触摸,其中多点触摸主要是针对移动设备的,但是利用cocos的事件分发机制来处理触摸事件,其大致流程几乎是一致的。 一、单点触摸 1、cocos2.x的处理方式...
  • u011787119
  • u011787119
  • 2015-12-06 23:38
  • 805

Android触摸事件的分发、拦截、处理

在Android触摸屏的过程中,有三个重要的方法,dispatchTouchEvent(事件分发)、onInterceptTouchEvent(事件拦截)、onTouchEvent(事件处理、消费)。...
  • qq_24636637
  • qq_24636637
  • 2016-01-21 18:15
  • 1946

Android View触摸事件传递机制

PS:以现在的眼光看以前写的博客感觉写的很烂,或许或一段时间再看现在的博客会有同样的感觉。所以每时每刻都去学习,去发现和理解新的东西。引言由于之前写的一篇关于Android事件传递顺序的博客质量太差,...
  • feidu804677682
  • feidu804677682
  • 2015-08-08 11:01
  • 4498

【Cocos2dx】触摸事件

Cocos2dx与玩家之间的互动,很大一个情况是通过处理玩家的触摸事件来实现的。在移动应用就是触摸,在PC应用就是点击。 下面用一个小例子说明,Cocos2dx的触摸事件。 如下图,每当用户触摸(...
  • yongh701
  • yongh701
  • 2015-09-02 09:18
  • 1228
    个人资料
    • 访问:33294次
    • 积分:1310
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论