`
djun100
  • 浏览: 183642 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

解决onTouchListener和onClickListener冲突

 
阅读更多
package com.flrsdk.service;

import com.flrsdk.activity.Activity_Community;
import com.unionpay.upomp.lthj.plugin.ui.R;

import android.app.Activity;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;

public class FloatService extends Service {

	WindowManager wm = null;
	WindowManager.LayoutParams wmParams = null;
	View view;
	private float mTouchStartX;
	private float mTouchStartY;
	private float x;
	private float y;
	int state;
	TextView tx1;
	TextView tx;
	ImageView iv;
	private float StartX;
	private float StartY;
	int delaytime=1000;
	@Override
	public void onCreate() {
		Log.d("FloatService", "onCreate");
		super.onCreate();
		view = LayoutInflater.from(this).inflate(R.layout.floating, null);

		iv = (ImageView) view.findViewById(R.id.img2);
		iv.setVisibility(View.GONE);
		createView();
		handler.postDelayed(task, delaytime);
	}

	private void createView() {
		SharedPreferences shared = getSharedPreferences("float_flag",
				Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = shared.edit();
		editor.putInt("float", 1);
		editor.commit();
		// 获取WindowManager
		wm = (WindowManager) getApplicationContext().getSystemService("window");
		// 设置LayoutParams(全局变量)相关参数
		wmParams = MyApplication.getMywmParams();
		wmParams.type = 2002;
		wmParams.flags |= 8;
		wmParams.gravity = Gravity.LEFT | Gravity.TOP; // 调整悬浮窗口至左上角
		// 以屏幕左上角为原点,设置x、y初始值
		wmParams.x = 0;
		wmParams.y = 0;
		// 设置悬浮窗口长宽数据
		wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
		wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
		wmParams.format = 1;
		
		wm.addView(view, wmParams);

		view.setOnTouchListener(new OnTouchListener() {
			
			public boolean onTouch(View v, MotionEvent event) {
				// 获取相对屏幕的坐标,即以屏幕左上角为原点
				x = event.getRawX();
				y = event.getRawY() - 25; // 25是系统状态栏的高度
				Log.i("currP", "currX" + x + "====currY" + y);// 调试信息
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					state = MotionEvent.ACTION_DOWN;
					StartX = x;
					StartY = y;
					// 获取相对View的坐标,即以此View左上角为原点
					mTouchStartX = event.getX();
					mTouchStartY = event.getY();
					Log.i("startP", "startX" + mTouchStartX + "====startY"
							+ mTouchStartY);// 调试信息

					break;
				case MotionEvent.ACTION_MOVE:
					state = MotionEvent.ACTION_MOVE;
					updateViewPosition();
					break;

				case MotionEvent.ACTION_UP:
					state = MotionEvent.ACTION_UP;

					updateViewPosition();
					//关键部分:移动距离较小,视为onclick点击行为
					if (Math.abs(x - StartX) < 1.5 && Math.abs(y - StartY) < 1.5){
						Intent serviceStop = new Intent();
						serviceStop.setClass(FloatService.this, FloatService.class);
						stopService(serviceStop);
						//进入社区页面
						Intent intent =new Intent(FloatService.this,Activity_Community.class);
						intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
						startActivity(intent);
					}
					mTouchStartX = mTouchStartY = 0;
					break;
				}
				return true;
			}
		});

		iv.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent serviceStop = new Intent();
				serviceStop.setClass(FloatService.this, FloatService.class);
				stopService(serviceStop);

			}
		});

	}

	public void showImg() {
		if (Math.abs(x - StartX) < 1.5 && Math.abs(y - StartY) < 1.5
				&& !iv.isShown()) {
			iv.setVisibility(View.VISIBLE);
		} else if (iv.isShown()) {
			iv.setVisibility(View.GONE);
		}
	}

	private Handler handler = new Handler();
	private Runnable task = new Runnable() {
		public void run() {
			// TODO Auto-generated method stub
			dataRefresh();
			handler.postDelayed(this, delaytime);
			wm.updateViewLayout(view, wmParams);
		}
	};

	public void dataRefresh() {

	}

	private void updateViewPosition() {
		// 更新浮动窗口位置参数
		wmParams.x = (int) (x - mTouchStartX);
		wmParams.y = (int) (y - mTouchStartY);
		wm.updateViewLayout(view, wmParams);
	}

	@Override
	public void onStart(Intent intent, int startId) {
		Log.d("FloatService", "onStart");
		
//		setForeground(true);
		
		super.onStart(intent, startId);
	}

	@Override
	public void onDestroy() {
		handler.removeCallbacks(task);
		Log.d("FloatService", "onDestroy");
		wm.removeView(view);
		super.onDestroy();
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}	
}

分享到:
评论

相关推荐

    android之Touch事件处理机制测试

    1. OnTouchListener和OnClickListener:在同一个View上同时设置OnTouchListener和OnClickListener可能会导致滑动事件与点击事件冲突。通常,可以通过在OnTouchListener中判断ACTION_UP事件来避免点击事件的触发。 2...

    ViewFlipper解决事件冲突

    滑动事件通常是通过GestureDetector或ViewPager等组件来处理的,而点击事件则通常与OnClickListener或OnTouchListener关联。当在一个ViewFlipper内部同时使用这两种事件时,可能会出现事件处理的冲突。例如,用户...

    viewpage和按钮的滑动冲突

    解决这种冲突是非常关键的,因为它直接影响到用户的交互体验。 首先,我们要理解`ViewPage`的滑动机制。`ViewPage`通过监听滑动手势来改变当前显示的页面。当用户在`ViewPage`上滑动时,`ViewPage`会捕获滑动事件并...

    Android 点击事件demo

    除了`OnClickListener`,还有`OnTouchListener`接口用于处理更复杂的触摸事件,包括按下、移动和释放等。`OnTouchListener`的`onTouch(View v, MotionEvent event)`方法会在每次触屏事件发生时被调用,开发者可以...

    OnTouch的简单demo

    在这种情况下,需要注意事件冲突的问题,因为`OnTouchListener`的`onTouch`返回值决定事件是否被消费,可能会影响到`OnClickListener`的触发。 在这个"简单demo"中,`MyOnTouch`很可能是一个实现了`OnTouchListener...

    Android ListView的单击和长按时,避免同时执行

    综上所述,要避免在ListView中单击和长按事件同时执行,我们需要合理地设计事件监听器和处理逻辑,通过控制事件的顺序和状态来防止冲突。同时,利用Android提供的API或第三方库,我们可以进一步优化用户体验,使得...

    仿微博客户端

    8. **事件监听与响应**:用户交互需要对应的事件监听器,比如点击事件、滑动事件等,这需要对OnClickListener、OnTouchListener等接口有清晰的理解。 9. **单元测试与调试**:为确保应用的质量,开发者会进行单元...

    自定义view点击事件的接口回调

    2. 事件冲突:如果自定义View同时使用了`OnClickListener`和`OnTouchListener`,需注意事件处理的优先级,避免产生冲突。 3. 事件冒泡:在自定义View的`onTouchEvent`中,返回`true`表示消费了事件,阻止事件继续...

    Android应用开发详解 源码(12-17章)

    本章主要讲解了Android中的事件处理机制,包括如何使用OnClickListener、OnTouchListener等接口来监听和处理用户交互事件。同时,也涉及到了滑动冲突的解决策略,如GestureDetector和Scroller的使用。源码分析可以...

    Android从源码的角度彻底理解事件分发机制的解析(上)

    在上述内容中提到的例子中,我们看到当同时设置了`OnClickListener`和`OnTouchListener`时,`onTouch`会先于`onClick`执行。这是因为`onTouch`是直接处理MotionEvent的,而`onClick`是在`ACTION_UP`事件中触发的。当...

    Android应用源码仿唱吧部分布局界面项目

    在本项目中,“Android应用源码仿唱吧部分布局界面项目”是一个针对初学者和进阶开发者提供的实战案例,...记得在实际操作中不断查阅文档和参考资料,遇到问题勇于探索和解决,这样你的Android开发之路将会更加坚实。

    安卓开发数独游戏

    数独游戏是一款经典的逻辑推理游戏,它在全世界范围内广受欢迎,尤其在移动设备上更是深受用户喜爱。在安卓平台上开发数独游戏...通过这个项目,开发者不仅可以提升安卓应用开发技能,还能锻炼逻辑思维和问题解决能力。

    仿QQ的界面侧滑效果

    同时,对于性能优化,比如手势冲突的处理、滑动冲突检测和解决等,也是不可忽视的细节。 总结起来,仿QQ的界面侧滑效果是通过结合手势识别、UI布局和事件处理来实现的。开发者需要理解并熟练运用平台特定的API和...

    修复了AbSlidingPlayView滑动BUG

    开发者可能需要重写onTouchEvent()方法或者使用OnTouchListener来解决这个问题,确保滑动事件能被正确分发到相应的视图上。 其次,"点击失效的错误"可能是指用户尝试点击AbSlidingPlayView中的某个元素时,点击事件...

    eclipse 计算器 Android

    11. **版本控制**:使用Git进行版本控制,可以帮助团队协作开发,记录代码的变更历史,便于回溯和解决冲突。 12. **发布与分发**:完成开发后,通过Google Play Console或其他第三方市场发布应用,遵循Android应用...

    Android应用源码之高仿奇艺.zip

    了解如何使用Git进行版本管理,提交、合并和解决冲突。 通过研究这个项目,开发者不仅可以提升Android应用开发技能,还能了解到如何创建一个功能完备、用户体验良好的视频应用。对于想要从事Android开发的人来说,...

    《疯狂Android讲义》第二版源码10-12章

    此外,还可能涵盖了手势识别和滑动冲突的解决策略。 3. **第12章:Android多媒体与传感器** 在这一章,你将接触到Android平台上的多媒体文件处理,如播放音频和视频,以及使用相机API。同时,还会涉及到Android的...

    Android-自定义跑马灯MarqueeView

    在压缩包中的`385841539-MarqueeView-6780dd3`文件可能是这个自定义跑马灯视图的源代码,你可以通过查看和学习这段代码,了解具体实现细节和解决问题的方法。这将帮助你理解如何在实际项目中创建和使用自定义的跑马...

    OnTouch事件对应代码

    2. **滑动冲突**:当同时使用`OnTouch`和`ScrollView`等可滚动的组件时,可能会导致滑动不流畅。这时可以考虑使用`GestureDetector`或`Scroller`来处理滑动事件。 3. **焦点问题**:有些`View`如`EditText`在获得...

    安卓Android 排班自定义view 支持左右上下滑动 支持点击事件,支持更改每个框的内容

    在Android中,这可以通过设置OnClickListener或者使用OnTouchListener来实现。当用户点击某个单元格时,可以触发特定的事件,例如弹出对话框显示详细信息,或者跳转到其他界面。 再者,每个框的内容可以被更改,这...

Global site tag (gtag.js) - Google Analytics