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;
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>

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索Android自定义控件
windowmanager 拖动、android 拖动控件、android 可拖动控件、android拖动控件效果、android 拖动控件布局,以便于您获取更多的相关知识。

时间: 2024-10-03 00:42:25

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

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;

Android自定义控件实现简单的轮播图控件_Android

最近要做一个轮播图的效果,网上看了几篇文章,基本上都能找到实现,效果还挺不错,但是在写的时候感觉每次都要单独去重新在Activity里写一堆代码.于是自己封装了一下.本篇轮播图实现原理原文出处:循环广告位组件的实现,这里只是做了下封装成一个控件,不必每次重复写代码了. 效果图: 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还需要在下面加一个指示器来标示滑动到了第几张轮播图.指示器我们可以用一个线性布局来根据要展示的轮播图

Android自定义控件之创建可复用的组合控件_Android

前面已学习了一种自定义控件的实现,是Andriod 自定义控件之音频条,还没学习的同学可以学习下,学习了的同学也要去温习下,一定要自己完全的掌握了,再继续学习,贪多嚼不烂可不是好的学习方法,我们争取学习了一种技术就会一种技术,而且不光看了就算了,最好的方法就是看完我自己再练习下,再扩展下,在原来的基础上在添加一些东西,比如,增加一些功能实现等等. 今天我们打算学习下另外一种自定义控件,就是创建可重复使用的组合控件,那么问题来了: 什么是可重复使用?就是在应用中,可以在多个地方共同使用一套代码.这

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使用GridLayout绘制自定义日历控件_Android

效果图 思路:就是先设置Gridlayout的行列数,然后往里面放置一定数目的自定义日历按钮控件,最后实现日历逻辑就可以了. 步骤: 第一步:自定义日历控件(初步) 第二步:实现自定义单个日期按钮控件 第三步:将第二步得到的控件动态添加到第一步的布局中,并实现日期逻辑 第四步:编写单个日期点击监听器接口 第一步:自定义日历控件(初步) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmln

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后系统没有响应点击事件) 解决方案 直接绑定监听是做不到的