Android实现单页面浮层可拖动view的示例代码
作者:赖床的猫 发布时间:2023-05-25 16:41:03
标签:android,拖动view
需求是需要在一个已经存在的页面添加一个可拖动的浮层广告。
使用到的技术:ViewDragHelper
效果如图:
封装好的类(继承自FrameLayout)
import android.content.Context;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import java.util.ArrayList;
/**
* Created by hq on 2017/10/10.
*/
public class DragFrameLayout extends FrameLayout {
String TAG = "DragFrameLayout";
ViewDragHelper dragHelper;
ArrayList<View> viewList;
public DragFrameLayout(@NonNull Context context) {
this(context, null);
}
public DragFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public DragFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
//第二步:创建存放View的集合
viewList = new ArrayList<>();
dragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
/**
* 是否捕获childView:
* 如果viewList包含child,那么捕获childView
* 如果不包含child,就不捕获childView
*/
@Override
public boolean tryCaptureView(View child, int pointerId) {
return viewList.contains(child);
}
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
}
/**
* 当捕获到child后的处理:
* 获取child的监听
*/
@Override
public void onViewCaptured(View capturedChild, int activePointerId) {
super.onViewCaptured(capturedChild, activePointerId);
if (onDragDropListener != null) {
onDragDropListener.onDragDrop(true);
}
}
/**
* 当释放child后的处理:
* 取消监听,不再处理
*/
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
if (onDragDropListener != null) {
onDragDropListener.onDragDrop(false);
}
}
/**
* 到左边界的距离
*/
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;
}
/**
* 到上边界的距离
*/
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return top;
}
});
}
/**
* 把要实现拖动的子view添加进来
* @param view
*/
public void addDragChildView(View view){
viewList.add(view);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//当手指抬起或事件取消的时候 就不拦截事件
int actionMasked = ev.getActionMasked();
if (actionMasked == MotionEvent.ACTION_CANCEL || actionMasked == MotionEvent.ACTION_UP) {
return false;
}
return dragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
dragHelper.processTouchEvent(event);
return true;
}
public interface OnDragDropListener {
void onDragDrop(boolean captured);
}
private OnDragDropListener onDragDropListener;
public void setOnDragDropListener(OnDragDropListener onDragDropListener) {
this.onDragDropListener = onDragDropListener;
}
}
使用方法:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<com.windfindtech.hqdemo.view.DragFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/df_content"
tools:context="com.windfindtech.hqdemo.MainActivity">
<ImageView
android:id="@+id/iv1"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="可拖拽文字" />
</com.windfindtech.hqdemo.view.DragFrameLayout>
MainActivity.java类
public class MainActivity extends AppCompatActivity {
DragFrameLayout m_dragFrameLayout;
ImageView m_imageView1;
TextView m_textView1;
String TAG = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
m_dragFrameLayout = (DragFrameLayout) findViewById(R.id.df_content);
m_imageView1 = (ImageView)findViewById(R.id.iv1);
m_textView1 = (TextView) findViewById(R.id.tv1);
// m_dragFrameLayout.addDragChildView(m_imageView1);
m_dragFrameLayout.addDragChildView(m_textView1);//具体拖拽动作使用回调即可
}
}
来源:http://www.jianshu.com/p/94477b804136


猜你喜欢
- mybatis-plus的代码生成器会在实体类中生成数据库所有字段,我们去用mapper接口查询时,会返回数据库所有的字段。但有些字段不是我
- 生命周期速览优先级servlet 的声明周期由 tomcat 服务器自行管辖,程序员无法插手;只要没有通过 url 访问 servlet,那
- OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力。由于O
- 提起ProgressBar,想必大家都比较熟悉,使用起来也是比较方便,直接在XML文件中引用,然后添加属性,运行就OK了,虽然使用Progr
- 本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下源码:import javax.imageio.ImageIO
- 本文实例讲述了Android使用ToggleButton实现开关效果的方法。分享给大家供大家参考,具体如下:activity_main.xm
- Android用SharedPreferences实现登录注册注销功能前言本文用SharedPreferences本地缓存账号信息来实现登录
- 找入口对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方
- 目录说明使用常见问题No such instance field: 'logger2'说明logback作为log4j的替代
- 一. 关于变量在之前的文章中,已经给大家详细地介绍过变量相关的内容,比如变量的概念、命名规范、变量的定义及底层原理等内容。但其实变量还有作用
- Android实现界面内嵌多种卡片视图,具体内容如下效果如图所示:1.选择某个界面时,对应的第几个小圆点亮:通过selector制造圆点和进
- 在upload.jsp页面中将多个文件域对象命名为相同的名字,这样在action中就可以将多个文件域解析成一个数组,数组的大小就是文件域的个
- 策略模式也是一种非常常用的设计模式,而且也不复杂。下面我们就来看看这种模式。定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使
- 使用WebClient和htmlunit实现简易爬虫import com.gargoylesoftware.htmlunit.WebClie
- 二叉树的分类(按存储结构)树的分类(按存储结构) &nbs
- java编程中字节流转换成字符流的实现方法import java.io.*;/*readLine方法是字符流BufferReader类中的方
- 本文实例为大家分享了Java实现石头剪刀布的具体代码,供大家参考,具体内容如下代码:package com.neusoft.test;imp
- 序初涉江湖,还望海涵!写点东西,纯粹是因为个人的记忆能力较弱,写些笔记罢了,若有错误还望雅正!对Android中的时间获取做个记录,以下为结
- 1、用ASCII码判断在 ASCII码表中,英文的范围是0-127,而汉字则是大于127,具体代码如下:string text = &quo
- 1、效果2、简介本文主角是ItemTouchHelper。它是RecyclerView对于item交互处理的一个「辅助类」,主要用于拖拽以及