- 浏览: 5820002 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
场景描述:
界面上有一个浮动按钮,可以用手指拖动,点击该按钮触发事件,我这里是启动扫描,留了一个空实现。
或者使用Service
只要启动这个 Service,就会创建一个随手指移动的悬浮窗,关闭 Service 会移除悬浮窗。另外由于这里设置了 Window 的 type 为 TYPE_PHONE, 所以需要 SYSTEM_ALERT_WINDOW 权限,也可以使用 TYPE_TOAST。
http://blog.csdn.net/manymore13
一个Android布局可以拖动排序子控件:RearrangeableLayout
https://github.com/rajasharan/RearrangeableLayout
界面上有一个浮动按钮,可以用手指拖动,点击该按钮触发事件,我这里是启动扫描,留了一个空实现。
private WindowManager wm; private View view;// 浮动按钮 /** * 添加悬浮View * @param paddingBottom 悬浮View与屏幕底部的距离 */ protected void createFloatView(int paddingBottom) { int w = 200;// 大小 wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); view = getLayoutInflater().inflate(R.layout.floatview, null); final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = LayoutParams.TYPE_BASE_APPLICATION;// 所有程序窗口的“基地”窗口,其他应用程序窗口都显示在它上面。 params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE; params.format = PixelFormat.TRANSLUCENT;// 不设置这个弹出框的透明遮罩显示为黑色 params.width = w; params.height = w; params.gravity = Gravity.TOP | Gravity.LEFT; int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenHeight = getResources().getDisplayMetrics().heightPixels; params.x = screenWidth - w; params.y = screenHeight - w - paddingBottom; view.setBackgroundColor(Color.TRANSPARENT); view.setVisibility(View.VISIBLE); view.setOnTouchListener(new OnTouchListener() { // 触屏监听 float lastX, lastY; int oldOffsetX, oldOffsetY; int tag = 0;// 悬浮球 所需成员变量 @Override public boolean onTouch(View v, MotionEvent event) { final int action = event.getAction(); float x = event.getX(); float y = event.getY(); if (tag == 0) { oldOffsetX = params.x; // 偏移量 oldOffsetY = params.y; // 偏移量 } if (action == MotionEvent.ACTION_DOWN) { lastX = x; lastY = y; } else if (action == MotionEvent.ACTION_MOVE) { params.x += (int) (x - lastX) / 3; // 减小偏移量,防止过度抖动 params.y += (int) (y - lastY) / 3; // 减小偏移量,防止过度抖动 tag = 1; wm.updateViewLayout(view, params); } else if (action == MotionEvent.ACTION_UP) { int newOffsetX = params.x; int newOffsetY = params.y; // 只要按钮一动位置不是很大,就认为是点击事件 if (Math.abs(oldOffsetX - newOffsetX) <= 20 && Math.abs(oldOffsetY - newOffsetY) <= 20) { onFloatViewClick(); } else { tag = 0; } } return true; } }); wm.addView(view, params); } /** * 点击浮动按钮触发事件,需要override该方法 */ protected void onFloatViewClick() { } /** * 将悬浮View从WindowManager中移除,需要与createFloatView()成对出现 */ protected void removeFloatView() { if (wm != null && view != null) { wm.removeViewImmediate(view); // wm.removeView(view);//不要调用这个,WindowLeaked view = null; wm = null; } } /** * 隐藏悬浮View */ protected void hideFloatView() { if (wm != null && view != null&&view.isShown()) { view.setVisibility(View.GONE); } } /** * 显示悬浮View */ protected void showFloatView(){ if (wm != null && view != null&&!view.isShown()) { view.setVisibility(View.VISIBLE); } }
或者使用Service
只要启动这个 Service,就会创建一个随手指移动的悬浮窗,关闭 Service 会移除悬浮窗。另外由于这里设置了 Window 的 type 为 TYPE_PHONE, 所以需要 SYSTEM_ALERT_WINDOW 权限,也可以使用 TYPE_TOAST。
public class WindowService extends Service { WindowManager windowManager; ImageView imageView; public WindowService() { } @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); } @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { if (imageView == null) { installWindow(); } return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); if (imageView != null) { windowManager.removeView(imageView); } } private void installWindow() { imageView = new ImageView(this.getBaseContext()); imageView.setImageResource(R.mipmap.ic_launcher_round); final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.format = PixelFormat.TRANSPARENT; layoutParams.width = 200; layoutParams.height = 200; layoutParams.gravity = Gravity.LEFT | Gravity.TOP; layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; windowManager.addView(imageView, layoutParams); imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { layoutParams.x = (int) event.getRawX() - 100; layoutParams.y = (int) event.getRawY() - 100; windowManager.updateViewLayout(imageView, layoutParams); return true; } }); } }
http://blog.csdn.net/manymore13
import com.mobovip.bgr.R; import android.content.Context; import android.graphics.PixelFormat; import android.graphics.Rect; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.ImageView; /** * @author manymore13 * @Blog <a * href="http://blog.csdn.net/manymore13">http://blog.csdn.net/manymore13 * </a> * @version 1.0 floatView = new FloatView(this); // 创建窗体 * floatView.setOnClickListener(this); // * 设置事件,你需要实现FloatView里的onclick接口 floatView.show(); // 显示该窗体 * floatView.hide(); // 隐藏窗体 */ public class FloatView extends ImageView { private Context c; private float mTouchX; private float mTouchY; private float x; private float y; private int startX; private int startY; private int imgId = R.drawable.ic_launcher; private int controlledSpace = 20; private int screenWidth; private int screenHeight; boolean isShow = false; private OnClickListener mClickListener; private WindowManager windowManager; private WindowManager.LayoutParams windowManagerParams = new WindowManager.LayoutParams(); public FloatView(Context context, AttributeSet attrs) { super(context, attrs); } public FloatView(Context c) { super(c); initView(c); } // 初始化窗体 public void initView(Context c) { windowManager = (WindowManager) c.getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm=getResources().getDisplayMetrics(); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; this.setImageResource(imgId); windowManagerParams.type = LayoutParams.TYPE_PHONE; windowManagerParams.format = PixelFormat.RGBA_8888; // 背景透明 windowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE; // 调整悬浮窗口至左上角,便于调整坐标 windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP; // 以屏幕左上角为原点,设置x、y初始值 windowManagerParams.x = 0; windowManagerParams.y = screenHeight>>1; // 设置悬浮窗口长宽数据 windowManagerParams.width = LayoutParams.WRAP_CONTENT; windowManagerParams.height = LayoutParams.WRAP_CONTENT; } public void setImgResource(int id) { imgId = id; } @Override public boolean onTouchEvent(MotionEvent event) { x = event.getRawX(); y = event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { mTouchX = event.getX(); mTouchY = event.getY(); startX = (int) event.getRawX(); startY = (int) event.getRawY(); break; } case MotionEvent.ACTION_MOVE: { updateViewPosition(); break; } case MotionEvent.ACTION_UP: { if (Math.abs(x - startX) < controlledSpace && Math.abs(y - startY) < controlledSpace) { if (mClickListener != null) { mClickListener.onClick(this); } } // Log.i("tag", "x=" + x + " startX+" + startX + " y=" + y // + " startY=" + startY); if (x <= screenWidth / 2) { x = 0; } else { x = screenWidth; } updateViewPosition(); break; } } return super.onTouchEvent(event); } // 隐藏该窗体 public void hide() { if (isShow) { windowManager.removeView(this); isShow = false; } } // 显示该窗体 public void show() { if (isShow == false) { windowManager.addView(this, windowManagerParams); isShow = true; } } @Override public void setOnClickListener(OnClickListener l) { this.mClickListener = l; } private void updateViewPosition() { // 更新浮动窗口位置参数 windowManagerParams.x = (int) (x - mTouchX); windowManagerParams.y = (int) (y - mTouchY); windowManager.updateViewLayout(this, windowManagerParams); // 刷新显示 } }
一个Android布局可以拖动排序子控件:RearrangeableLayout
https://github.com/rajasharan/RearrangeableLayout
发表评论
-
NestedScrollView滚动到顶部固定子View悬停挂靠粘在顶端
2018-10-31 20:45 6993网上有一个StickyScrollView,称之为粘性Scro ... -
自定义Behavior实现AppBarLayout越界弹性效果
2017-03-31 09:33 10369一、继承AppBarLayout.Beha ... -
Android - 一种相似图片搜索算法的实现
2017-03-31 09:33 2622算法 缩小尺寸。 将图片缩小到8x8的尺寸,总共64个 ... -
使用SpringAnimation实现带下拉弹簧动画的 ScrollView
2017-03-30 11:30 2848在刚推出的 Support Library 25.3.0 里面 ... -
Android为应用添加角标(Badge)
2017-03-30 11:21 61751.需求简介 角标是什么意思呢? 看下图即可明了: 可 ... -
Android端与笔记本利用局域网进行FTP通信
2017-03-23 10:17 978先看图 打开前: 打开后: Activity类 ... -
PorterDuffColorFilter 在项目中的基本使用
2017-03-03 10:58 1354有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求 ... -
ColorAnimationView 实现了滑动Viewpager 时背景色动态变化的过渡效果
2017-02-24 09:41 2220用法在注释中: import android.anima ... -
迷你轻量级全方向完美滑动处理侧滑控件SlideLayout
2017-01-16 16:53 2594纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 sup ... -
Effect
2017-01-05 09:57 0https://github.com/JetradarMobi ... -
动态主题库Colorful,容易地改变App的配色方案
2016-12-27 14:49 2565Colorful是一个动态主题库,允许您很容易地改变App的配 ... -
对视图的对角线切割DiagonalView
2016-12-27 14:23 1118提供对视图的对角线切割,具有很好的用户定制 基本用法 ... -
仿淘宝京东拖拽商品详情页上下滚动黏滞效果
2016-12-26 16:53 3494比较常用的效果,有现成的,如此甚好!:) import ... -
让任意view具有滑动效果的SlideUp
2016-12-26 09:26 1707基本的类,只有一个: import android.a ... -
AdvancedWebView
2016-12-21 09:44 16https://github.com/delight-im/A ... -
可设置圆角背景边框的按钮, 通过调节色彩明度自动计算按下(pressed)状态颜色
2016-11-02 22:13 1920可设置圆角背景边框的的按钮, 通过调节色彩明度自动计算按下(p ... -
网络请求库相关
2016-10-09 09:35 62https://github.com/amitshekhari ... -
ASimpleCache一个简单的缓存框架
2015-10-26 22:53 2178ASimpleCache 是一个为android制定的 轻量级 ... -
使用ViewDragHelper实现的DragLayout开门效果
2015-10-23 10:55 3415先看一下图,有个直观的了解,向下拖动handle就“开门了”: ... -
保证图片长宽比的同时拉伸图片ImageView
2015-10-16 15:40 3733按比例放大图片,不拉伸失真 import android. ...
相关推荐
在这里,我们将会深入探讨如何使用WindowManager来实现一个可移动的悬浮按钮,并结合`FloatView`的实现进行讨论。 首先,让我们了解`WindowManager`。它是Android的系统服务,可以通过`Context.getSystemService...
在Android开发中,创建一个可拖动的悬浮窗和对话框悬浮窗是一项常见的需求,尤其在实现自定义功能或者增强用户体验时。这个压缩包文件很可能包含了一套完整的示例代码,帮助开发者理解并实现这样的功能。下面将详细...
本压缩包文件“安卓悬浮窗相关-悬浮按钮随意拖动通过接口回调处理点击事件.rar”包含了实现这种功能的相关代码示例,让我们来详细探讨一下其涉及的关键知识点。 首先,悬浮窗在安卓中通常通过`WindowManager`服务和...
通过这个 `(android实现可拖拽的悬浮框)使用示例`,开发者可以了解到如何结合`WindowManager`、触摸事件监听以及自定义服务来创建一个可拖动的悬浮窗。这只是一个基础的实现,实际应用中可能需要考虑更多的细节,如...
在Android中,创建悬浮窗通常需要使用` WindowManager`服务来添加和管理窗口,并通过`LayoutParams`来设置窗口的属性,如位置、大小和类型等。`FloatsWindowView`可能包含了自定义布局和触摸事件处理,以便实现可...
- 在Service中,使用`WindowManager`接口添加一个布局到屏幕顶部,这个布局就是悬浮按钮。 - 为了使按钮始终显示在其他应用之上,需要设置窗口类型为`WindowManager.LayoutParams.TYPE_SYSTEM_ALERT`。 2. **悬浮...
3. 创建一个`WindowManager`实例,用来管理悬浮按钮的显示和隐藏: ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager....
通过组合这些功能,你可以在应用中创建一个可自由移动、显示网络图片并带有旋转动画的悬浮按钮。`MyTabTest`可能是项目中的一个测试模块或者一个具体的功能类,具体实现细节需要根据源代码来分析。
在安卓平台上,实现一个可拖动且点击响应的桌面悬浮窗是一项常见的需求,尤其是在开发辅助工具或者自定义功能的应用时。这个标题“可拖动点击的桌面悬浮窗”所涉及的知识点主要涵盖以下几个方面: 1. **悬浮窗权限*...
在获取 WindowManager 对象和屏幕尺寸后,需要创建一个 WindowManager.LayoutParams 对象,用于设置悬浮按钮的布局参数。在该对象中,需要设置 Window 的 type、format、gravity、flags 等属性。其中,type 属性用于...
在标题中提到的"悬浮窗的使用",主要涉及到如何创建和管理这样的窗口。悬浮窗通常用于提供便捷的操作,如系统监控、快捷工具或者特定应用的通知,例如360安全卫士的“加速球”。 在Android平台上,实现悬浮窗主要...
在Android开发中,悬浮窗(Float View)是一种特殊类型的窗口,它可以在所有应用之上显示,让用户在使用其他应用的同时查看或操作悬浮窗内容。这种功能常用于音乐播放器、即时通讯应用以及各种辅助工具中。标题提到...
Android 可任意拖动的悬浮窗功能实现 Android 操作系统中,悬浮窗功能是一种常见的用户界面元素,能够提供更多的交互方式。今天,我们将介绍如何实现 ...这种功能可以在很多场景下使用,例如悬浮球、悬浮按钮等。
首先,悬浮框在Android中通常是通过`WindowManager`服务和自定义布局来创建的。在Xamarin.Android中,你需要先获取到`WindowManager`的实例,这可以通过`Context.GetSystemService`方法并传入`WindowService`来实现...
本文将深入探讨如何在Android中创建一个可托拉拽的自定义悬浮窗,并在任何Activity界面上实现其功能,最后讨论如何删除它。 首先,要创建自定义悬浮窗,我们需要了解`WindowManager`接口。`WindowManager`是Android...
1. 创建一个悬浮窗布局:在XML文件中设计悬浮窗的UI结构,例如包含一个ImageView或TextView,以展示所需内容。 ```xml <!-- res/layout/my_float_view.xml --> android:layout_width="wrap_content" android:...
它允许我们将视图(View)添加到窗口层级结构中,这些视图可以作为浮动窗口显示在应用之上或之下,比如我们常见的悬浮按钮、悬浮窗等。 实现可伸缩式悬浮窗的关键步骤如下: 1. 创建悬浮窗布局: 首先,我们需要...