多触点监听

#ifndef   __HELLOWORLD_SCENE_H__
#define   __HELLOWORLD_SCENE_H__

#include   "cocos2d.h"

using   namespace   cocos2d ;

// 多触点监听
class   HelloWorld   :   public   cocos2d ::   CCLayer
{
public  :
        // 初始化
        virtual   bool   init ();
        static   cocos2d   ::  CCScene *   scene ();
        CREATE_FUNC  ( HelloWorld   );

        // 重写触屏回调函数
        virtual   void   registerWithTouchDispatcher (   void  );
        virtual   void   ccTouchesBegan (   CCSet  *   pTouch  ,   CCEvent  *   pEvent  );
        virtual   void   ccTouchesMoved (   CCSet  *   pTouch  ,   CCEvent  *   pEvent  );
        virtual   void   ccTouchesEnded (   CCSet  *   pTouch  ,   CCEvent  *   pEvent  );

        // 重写生命周期函数
        virtual   void   onExit ();
};



#endif


#include   "HelloWorldScene.h"
#include   "../CocosDenshion/win32/MciPlayer.h"
#include   "sprite_nodes/CCAnimation.h"
#include   "AppMacros.h"
#include   "Hello.h"
#include   "menu_nodes/CCMenuItem.h"


using   namespace   cocos2d ;
using   namespace   CocosDenshion ;
USING_NS_CC   ;

// 以上是Hello 场景     以下是HelloWorld的场景


// 返回一个特定的场景
CCScene  *   HelloWorld  :: scene   ()
{
        // 创建一个场景
        CCScene  *   scene   =   CCScene ::   create  ();

        // 将 HelloWorld 层加到场景 之中
        HelloWorld  *   layer   =   HelloWorld ::   create  ();
        scene  -> addChild   (  layer );
        return   scene   ;
}

// 对HelloWorld的场景进行初始化
bool   HelloWorld   ::  init ()
{
        bool   bInitSucceed   =   false  ;
     
        if  (! CCLayer   ::  init ())
        {
             return   bInitSucceed   ;
        }

        // 开启过触点监听务必调用此函数
        setTouchEnabled  ( true   );

        CCSprite  *   pSprite1   =   CCSprite  :: create   (  "CloseNormal.png" );
        pSprite1  -> setColor   (  ccc3 (   255  ,   255  ,   0  ));

        CCSprite  *   pSprite2   =   CCSprite  :: create   (  "CloseSelected.png"  );

        pSprite1  -> setPosition   (  ccp (   150  ,   100  ));
        pSprite2  -> setPosition   (  ccp (   200  ,   300  ));

        addChild  ( pSprite1   ,   0   ,   91   );
     addChild  ( pSprite2   ,   0   ,   92   );

        return   true   ;
}

// 注册多触点监听
void   HelloWorld   ::  registerWithTouchDispatcher ()
{
        CCDirector  :: sharedDirector   ()->  getTouchDispatcher ()->   addStandardDelegate  ( this   ,   0   );
}

void   HelloWorld   ::  onExit ()
{
        CCDirector  :: sharedDirector   ()->  getTouchDispatcher ()->   removeDelegate  ( this   );
        CCLayer  :: onExit   ();
}

void   HelloWorld   ::  ccTouchesBegan (   CCSet  *   pTouch  ,   CCEvent  *   pEvent  )
{
        CCLOG  ( "ccTouchBegan"   );

        CCSetIterator   iter   =   pTouch  -> begin   ();
        for  (   ;   iter   !=   pTouch  -> end   ();   iter   ++)
        {
             CCTouch  *   pTouch   =   ( CCTouch   *)(*  iter );
             CCPoint     location   =   pTouch  -> getLocation   ();

             // 第一个触点
             if  ( pTouch   ->  getID ()   ==   0  )
             {
                 CCSprite  *   pSprite1   =   (  CCSprite *)   this  -> getChildByTag   (  91 );
                 pSprite1  -> setPosition   (  location );
             }
             else   if   (  pTouch ->   getID  ()   ==   1   )
             {
                 // 第二个触点
                 CCSprite  *   pSprite2   =   (  CCSprite *)   this  -> getChildByTag   (  92 );
                 pSprite2  -> setPosition   (  location );
             }
        }

}

// 用户手指进行移动或者拖拽
void   HelloWorld   ::  ccTouchesMoved (   CCSet  *   pTouch  ,   CCEvent  *   pEvent  )
{
        CCLOG  ( "ccTouchMoved"   );

        CCSetIterator   iter   =   pTouch  -> begin   ();
        for  (   ;   iter   !=   pTouch  -> end   ();   iter   ++)
        {
             CCTouch  *   pTouch   =   ( CCTouch   *)(*  iter );
             CCPoint     location   =   pTouch  -> getLocation   ();

             // 第一个触点
             if  ( pTouch   ->  getID ()   ==   0  )
             {
                 CCSprite  *   pSprite1   =   (  CCSprite *)   this  -> getChildByTag   (  91 );
                 pSprite1  -> setPosition   (  location );
             }
             else   if   (  pTouch ->   getID  ()   ==   1   )
             {
                 // 第二个触点
                 CCSprite  *   pSprite2   =   (  CCSprite *)   this  -> getChildByTag   (  92 );
                 pSprite2  -> setPosition   (  location );
             }
        }
}


void   HelloWorld   ::  ccTouchesEnded (   CCSet   *   pTouch  ,   CCEvent   *  pEvent )
{
        CCLOG  ( "ccTouchEnded"   );

        if  (! pTouch   )
        {
             CCLOG  ( "HelloWorld::ccTouchesEnded pTouch Null"   );
             return   ;
        }

        CCSetIterator   iter   =   pTouch  -> begin   ();
        for  (   ;   iter   !=   pTouch  -> end   ();   iter   ++)
        {
             CCTouch  *   pTouch   =   ( CCTouch   *)(*  iter );
             CCPoint     location   =   pTouch  -> getLocation   ();

             CCLOG  ( "pTouch 触摸点 %d 的坐标: x:%f, y:%f"   ,   pTouch  -> getID   (),   location   .  x ,   location .   y  );
        }
}

  
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
安卓悬浮窗实现多触点拖动的方法如下: 1. 首先,需要创建一个悬浮窗的布局文件,例如`float_window.xml`,并在其中定义一个可拖动的视图,例如一个`ImageView`。 2. 在悬浮窗的服务类中,通过`WindowManager`来添加悬浮窗,并设置其布局参数。 3. 在悬浮窗的服务类中,通过触摸事件监听器来实现多触点拖动的功能。在触摸事件监听器中,可以通过`MotionEvent`对象获取到触摸事件的坐标信息,并根据坐标信息来更新悬浮窗的位置。 4. 在悬浮窗的服务类中,需要处理悬浮窗的点击事件,以便实现其他功能,例如点击悬浮窗打开应用程序等。 下面是一个示例代码,演示了如何实现安卓悬浮窗的多触点拖动: ```java // 创建悬浮窗的布局文件 float_window.xml <ImageView android:id="@+id/float_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/float_icon" /> // 在悬浮窗的服务类中实现多触点拖动 public class FloatWindowService extends Service { private WindowManager windowManager; private WindowManager.LayoutParams layoutParams; private ImageView floatView; private int lastX, lastY; private int screenWidth, screenHeight; @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); layoutParams = new WindowManager.LayoutParams(); layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; layoutParams.format = PixelFormat.RGBA_8888; layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; layoutParams.gravity = Gravity.START | Gravity.TOP; layoutParams.x = 0; layoutParams.y = 0; layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; floatView = new ImageView(this); floatView.setImageResource(R.drawable.float_icon); windowManager.addView(floatView, layoutParams); DisplayMetrics dm = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(dm); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; floatView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; layoutParams.x += dx; layoutParams.y += dy; if (layoutParams.x < 0) { layoutParams.x = 0; } if (layoutParams.y < 0) { layoutParams.y = 0; } if (layoutParams.x > screenWidth - floatView.getWidth()) { layoutParams.x = screenWidth - floatView.getWidth(); } if (layoutParams.y > screenHeight - floatView.getHeight()) { layoutParams.y = screenHeight - floatView.getHeight(); } windowManager.updateViewLayout(floatView, layoutParams); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: // 处理点击事件 break; } return true; } }); } @Override public void onDestroy() { super.onDestroy(); if (floatView != null) { windowManager.removeView(floatView); } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 请注意,为了实现悬浮窗的多触点拖动,需要在AndroidManifest.xml文件中添加悬浮窗权限: ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值