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;
}
}
分享到:
相关推荐
1. OnTouchListener和OnClickListener:在同一个View上同时设置OnTouchListener和OnClickListener可能会导致滑动事件与点击事件冲突。通常,可以通过在OnTouchListener中判断ACTION_UP事件来避免点击事件的触发。 2...
滑动事件通常是通过GestureDetector或ViewPager等组件来处理的,而点击事件则通常与OnClickListener或OnTouchListener关联。当在一个ViewFlipper内部同时使用这两种事件时,可能会出现事件处理的冲突。例如,用户...
解决这种冲突是非常关键的,因为它直接影响到用户的交互体验。 首先,我们要理解`ViewPage`的滑动机制。`ViewPage`通过监听滑动手势来改变当前显示的页面。当用户在`ViewPage`上滑动时,`ViewPage`会捕获滑动事件并...
除了`OnClickListener`,还有`OnTouchListener`接口用于处理更复杂的触摸事件,包括按下、移动和释放等。`OnTouchListener`的`onTouch(View v, MotionEvent event)`方法会在每次触屏事件发生时被调用,开发者可以...
在这种情况下,需要注意事件冲突的问题,因为`OnTouchListener`的`onTouch`返回值决定事件是否被消费,可能会影响到`OnClickListener`的触发。 在这个"简单demo"中,`MyOnTouch`很可能是一个实现了`OnTouchListener...
综上所述,要避免在ListView中单击和长按事件同时执行,我们需要合理地设计事件监听器和处理逻辑,通过控制事件的顺序和状态来防止冲突。同时,利用Android提供的API或第三方库,我们可以进一步优化用户体验,使得...
8. **事件监听与响应**:用户交互需要对应的事件监听器,比如点击事件、滑动事件等,这需要对OnClickListener、OnTouchListener等接口有清晰的理解。 9. **单元测试与调试**:为确保应用的质量,开发者会进行单元...
2. 事件冲突:如果自定义View同时使用了`OnClickListener`和`OnTouchListener`,需注意事件处理的优先级,避免产生冲突。 3. 事件冒泡:在自定义View的`onTouchEvent`中,返回`true`表示消费了事件,阻止事件继续...
本章主要讲解了Android中的事件处理机制,包括如何使用OnClickListener、OnTouchListener等接口来监听和处理用户交互事件。同时,也涉及到了滑动冲突的解决策略,如GestureDetector和Scroller的使用。源码分析可以...
在上述内容中提到的例子中,我们看到当同时设置了`OnClickListener`和`OnTouchListener`时,`onTouch`会先于`onClick`执行。这是因为`onTouch`是直接处理MotionEvent的,而`onClick`是在`ACTION_UP`事件中触发的。当...
在本项目中,“Android应用源码仿唱吧部分布局界面项目”是一个针对初学者和进阶开发者提供的实战案例,...记得在实际操作中不断查阅文档和参考资料,遇到问题勇于探索和解决,这样你的Android开发之路将会更加坚实。
数独游戏是一款经典的逻辑推理游戏,它在全世界范围内广受欢迎,尤其在移动设备上更是深受用户喜爱。在安卓平台上开发数独游戏...通过这个项目,开发者不仅可以提升安卓应用开发技能,还能锻炼逻辑思维和问题解决能力。
同时,对于性能优化,比如手势冲突的处理、滑动冲突检测和解决等,也是不可忽视的细节。 总结起来,仿QQ的界面侧滑效果是通过结合手势识别、UI布局和事件处理来实现的。开发者需要理解并熟练运用平台特定的API和...
开发者可能需要重写onTouchEvent()方法或者使用OnTouchListener来解决这个问题,确保滑动事件能被正确分发到相应的视图上。 其次,"点击失效的错误"可能是指用户尝试点击AbSlidingPlayView中的某个元素时,点击事件...
11. **版本控制**:使用Git进行版本控制,可以帮助团队协作开发,记录代码的变更历史,便于回溯和解决冲突。 12. **发布与分发**:完成开发后,通过Google Play Console或其他第三方市场发布应用,遵循Android应用...
了解如何使用Git进行版本管理,提交、合并和解决冲突。 通过研究这个项目,开发者不仅可以提升Android应用开发技能,还能了解到如何创建一个功能完备、用户体验良好的视频应用。对于想要从事Android开发的人来说,...
此外,还可能涵盖了手势识别和滑动冲突的解决策略。 3. **第12章:Android多媒体与传感器** 在这一章,你将接触到Android平台上的多媒体文件处理,如播放音频和视频,以及使用相机API。同时,还会涉及到Android的...
在压缩包中的`385841539-MarqueeView-6780dd3`文件可能是这个自定义跑马灯视图的源代码,你可以通过查看和学习这段代码,了解具体实现细节和解决问题的方法。这将帮助你理解如何在实际项目中创建和使用自定义的跑马...
2. **滑动冲突**:当同时使用`OnTouch`和`ScrollView`等可滚动的组件时,可能会导致滑动不流畅。这时可以考虑使用`GestureDetector`或`Scroller`来处理滑动事件。 3. **焦点问题**:有些`View`如`EditText`在获得...
在Android中,这可以通过设置OnClickListener或者使用OnTouchListener来实现。当用户点击某个单元格时,可以触发特定的事件,例如弹出对话框显示详细信息,或者跳转到其他界面。 再者,每个框的内容可以被更改,这...