Android使用WindowManager制作一个可拖动的控件

效果图如下

第一步:新建DragView继承RelativeLayout

package com.rong.activity; import com.rong.test.R; import android.content.Context; import android.graphics.Color; import android.graphics.PixelFormat; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.RelativeLayout; public class DragView extends RelativeLayout { private WindowManager windowManager;// 用于可拖动的浮动窗口 private WindowManager.LayoutParams windowParams;// 浮动窗口的参数 private Button myButton; public DragView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { View.inflate(getContext(), R.layout.layout_my, this); myButton = new Button(getContext()); myButton.setText("我的"); myButton.setBackgroundColor(Color.RED); } @Override public boolean onTouchEvent(MotionEvent event) { // 获取当前点的xy位置 int currentX = (int) event.getX(); int currentY = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (windowManager == null) { setWindowParams(currentX, currentY); windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); windowManager.addView(myButton, windowParams); } break; case MotionEvent.ACTION_MOVE: windowParams.x = currentX; windowParams.y = currentY; windowManager.updateViewLayout(myButton, windowParams); break; case MotionEvent.ACTION_UP: // windowManager.removeView(myButton); break; } return true; } private void setWindowParams(int x, int y) { // 建立item的缩略图 windowParams = new WindowManager.LayoutParams(); windowParams.gravity = Gravity.TOP | Gravity.LEFT;// 这个必须加 // 得到preview左上角相对于屏幕的坐标 windowParams.x = x; windowParams.y = y; // 设置宽和高 windowParams.width = 200; windowParams.height = 200; windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; windowParams.format = PixelFormat.TRANSLUCENT; windowParams.windowAnimations = 0; } }

第二步:新建布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_touchlayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:orientation="vertical" > <com.rong.activity.DragView android:id="@+id/main_touchview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="#ff0000" /> </RelativeLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-11-13 06:56:54

Android使用WindowManager制作一个可拖动的控件的相关文章

Android使用WindowManager制作一个可拖动的控件_Android

效果图如下 第一步:新建DragView继承RelativeLayout package com.rong.activity; import com.rong.test.R; import android.content.Context; import android.graphics.Color; import android.graphics.PixelFormat; import android.util.AttributeSet; import android.view.Gravity;

imageview-Android中怎么让一个布局中所有控件都获得这个布局的点击状态

问题描述 Android中怎么让一个布局中所有控件都获得这个布局的点击状态 我在一个线性布局中有一个ImageView和一个TextView,怎么设置点击这个线性布局的时候ImageView处于选取状态,还有selector怎么设置 解决方案 你可以在这个layout的点击事件中,设置ImageView的setPressed(true),这样就可以在selector中因公pressed的设置了 解决方案二: 我想你正需要它们: setDuplicateParentStateEnabled 子控件

Android中SeekBar拖动条控件使用方法详解

SeekBar拖动条控件使用方法,具体内容如下 一.简介 1. 二.SeekBar拖动条控件使用方法 1.创建SeekBar控件 <SeekBar android:id="@+id/SeekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" android:progress="30" /> 2.添加setOnS

Android仿英语流利说取词放大控件的实现方法(附demo源码下载)_Android

本文实例讲述了Android仿英语流利说取词放大控件的实现方法.分享给大家供大家参考,具体如下: 1 取词放大控件 英语流利说是一款非常帮的口语学习app,在app的修炼页面长按屏幕,会弹出一个放大镜,当手指移到某个单词的附近,可以看到该英文单词会被选中,效果如下图所示: 2 代码示例 该控件挺有意思,于是我写了个简单的demo,完整实例代码点击此处本站下载.,程序运行后的效果如下: 3 实现原理 该控件的实现原理比较简单,下面介绍几个比较重要的类 ① WordView 在实习该控件的过程中,我

Android 自定义View 三板斧之二——组合现有控件

通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 上文说过了如何继承现有控件来自定义控件,这节我们来讨论第二个议题.怎么将控件组合来实现一个功能强大的自定义控件. 先看看创建组合控件的好处吧,创建组合控件能够很好的创建具有组合功能的控件集合.那我们一般又是怎么做的了,一般我们来继承一个合适的ViewGroup,再为他创建一个新功能,从而就形成了一个新功能的控件.我们还

在一个activity里如何监听另一个xml里的控件的事件

问题描述 在一个activity里如何监听另一个xml里的控件的事件 比如我有两个xml:main.xml和main1.xml 我在一个activity里setcontentView(R.layout.main) 而我想在这个activity里监听main1.xml里一个button按钮的点击事件,我应该怎么做? 求大神指导.(试过了LayouInflater拿到了main1.xml里button的id,但是设置onclicklister后系统没有响应点击事件) 解决方案 直接绑定监听是做不到的

在android系统中如何监控可写入的控件获得焦点这样的事件

问题描述 在android系统中如何监控可写入的控件获得焦点这样的事件 在写一个手机监控程序的时候发现,需要监控用户的可输入状态.不知道有没有大神能帮忙提供些思路.这是个自主的监控程序,将会在android模拟器中运行,用作与主机进行通信.不是在真正在手机中运行的木马. 初始想法是枚举所有的窗口,然后找出哪一个窗口获得焦点,并判断此窗口是否有edit属性,嗯,PC上应该就是这样做到吧,键盘勾子是不行的,原因是不知道当前是否可输入状态.只不过在android中实在不知道该怎么做,另外,枚举的缺陷是

android B界面如何获取A界面的控件

问题描述 android B界面如何获取A界面的控件 我有2个界面,A与B,从A界面跳转B,在B界面我想获取到A界面的控件(比如一个FragmentTabHost),我想把它隐藏掉,因为我跳转到B的时候,B界面还显示着A界面的FragmentTabHost 解决方案 如果是fragment方式切换,可以放到到这个控件,通过activity.findviewbyid就能找到.如果是activity切换,那找不到该控件. 如果要隐藏,建议在跳转前隐藏,当前界面的事情处理完了再跳转 解决方案二: 看看

Android开发之无痕过渡下拉刷新控件的实现思路详解_Android

相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下拉刷新控件普遍缺陷演示 以直播吧APP为例: 第1种情况: 滑动控件在初始的0位置时,手势往下滑动然后再往上滑动,可以看到滑动到初始位置时滑动控件不能滑动. 原因: 下拉刷新控件响应了触摸事件,后续的一系列事件都由它来处理,当滑动控件到顶端的时候,滑动事件都被下拉刷新控件消费掉了,传递不到它的子控件