android可拖动的控件,Android拖动控件的实现,自定义可拖动的LinearLayout
工作内容;
1.拖动控件
2.自定义可拖动的LinearLayout
学习分享:
一、拖动控件的实现步骤:
【前提:控件在RelativeLayout中,或者在GridLayout中】
1.按下图搞懂几个坐标
视图宽度 view.getWidth();
视图高度 view.getHeight()
橘色线:view.getLeft()
蓝色线:view.getRight()
红色线:view.getTop()
粉色线:view.getBottom()
上下左右的偏移都是相对于(0.0)来说的
.
2. MotionEvent类中 getRowX()和 getX()
1、event.getRowX():触摸点相对于屏幕原点的x坐标
2、event.getX(): 触摸点相对于其所在组件原点的x坐标
3.实现控件拖动代码段:【仅用于view,不适合viewGroup】效果:view跟着手指走
//获取屏幕宽高,用于控制控件在屏幕内移动
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels - 100;//这里减去的100是下边的back键和menu键那一栏的高度,看情况而定
//核心代码段【OnTouchListener()的onTouch方法,控件去设置它就可以了】
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();//移动
LogTool.e("发生Touch事件x:y____"":""\nrawX:rawY____"
+event.getRawX()+":"+event.getRawY());
//event.getRawX()事件点距离屏幕左上角的距离
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
if (left < 0) { //最右边
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) { //最下边
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);//再次将滑动其实位置定位
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
二、自定义可拖动linearLayout【类似于上面的拖动控件的代码,就直接贴java代码了】
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class DragViewGroup extends LinearLayout {
private int lastX,lastY,screenWidth,screenHeight;
public DragViewGroup(Context context) {
this(context, null);
}
public DragViewGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DragViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels-50;//减去下边的高度
}
//定位
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//可以在这里确定这个viewGroup的:宽 = r-l.高 = b - t
}
//拦截touch事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// LogTool.e("onInterceptTouchEvent");
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
lastX = (int) ev.getRawX();//设定移动的初始位置相对位置
lastY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE://移动
//event.getRawX()事件点距离屏幕左上角的距离
int dx = (int) ev.getRawX() - lastX;
int dy = (int) ev.getRawY() - lastY;
int left = this.getLeft() + dx;
int top = this.getTop() + dy;
int right = this.getRight() + dx;
int bottom = this.getBottom() + dy;
if (left < 0) { //最左边
left = 0;
right = left + this.getWidth();
}
if (right > screenWidth) { //最右边
right = screenWidth;
left = right - this.getWidth();
}
if (top < 0) { //最上边
top = 0;
bottom = top + this.getHeight();
}
if (bottom > screenHeight) {//最下边
bottom = screenHeight;
top = bottom - this.getHeight();
}
this.layout(left, top, right, bottom);//设置控件的新位置
// LogTool.e("position:" + left + ", " + top + ", " + right + ", " + bottom);
lastX = (int) ev.getRawX();//再次将滑动其实位置定位
lastY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
return super.onInterceptTouchEvent(ev);
}
}
布局代码;
xml version="1.0"encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"android:id="@+id/linear_save_share">android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="3dp"android:orientation="vertical"android:background="@drawable/shape_save_share_linear">android:layout_width="40dp"android:layout_height="40dp"android:background="@drawable/unsaved"android:id="@+id/iv_save_ss"/>android:layout_width="match_parent"android:layout_height="0.5dp"android:background="@color/white"/>android:layout_width="40dp"android:layout_height="40dp"android:background="@drawable/share"android:id="@+id/iv_share_ss"/> include代码:
layout="@layout/layout_save_share"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_marginTop="60dp"/>
android可拖动的控件,Android拖动控件的实现,自定义可拖动的LinearLayout相关推荐
- Android自定义Seekbar拖动条式样
SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...
- Android学习笔记18:自定义Seekbar拖动条式样
SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...
- android md 控件,Android基本UI控件.md
# Android基本UI控件 ## *TextView 文本框* ### TextView常用用法 | 主要方法 | 功能描述 | | :----------: | :--------------- ...
- Android 打造完美的侧滑菜单/侧滑View控件
概述 Android 打造完美的侧滑菜单/侧滑View控件,完全自定义实现,支持左右两个方向弹出,代码高度简洁流畅,兼容性高,控件实用方便. 详细 代码下载:http://www.demodashi. ...
- 视频教程-Android Material Design 新控件-Android
Android Material Design 新控件 刘志远,北京邮电大学硕士研究生, 北京育华志远科技有限公司创始人, 育华志远教育品牌负责人,育华志远课程体系打造者. 率领团队为互联网行业培训千 ...
- 如何在Android实现桌面清理内存简单Widget小控件
如何在Android实现桌面清理内存简单Widget小控件 我们经常会看到类似于360.金山手机卫士一类的软件会带一个widget小控件,显示在桌面上,上面会显示现有内存大小,然后会带一个按键功能来一 ...
- android开发重要控件,Android界面编程——Android基本控件
Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...
- Android之横向滑动的广告(网格控件)
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53264494 本文出自:[顾林海的博客] ##前言 很早以前写过一篇自 ...
- android悬浮窗按钮在哪,android——悬浮窗控件Toast
前端 后端 Toast 是一个悬浮窗控件,在不影响用户操作的条件下,按动按钮显示悬浮窗. 不同的是,Toast不支持点击事件,需要函数调用.所以要在外部函数初始化我们按钮的 控件,当我们的对象V创建出 ...
- android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能
本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能.分享给大家供大家参考,具体如下: 工具类 ... public static void hideKeyboard(Co ...
最新文章
- 三、RabbitMQ安装
- Android使用ActivityGroup设置android:windowSoftInputMode失效的问题
- 最全面的JVM G1学习笔记
- asp.net页面中hmtl注释的问题
- java 方法 示例_Java扫描器具有示例的NextNextShort()方法
- vconfig命令打通直连网络
- 快速傅里叶变换学习笔记(更新中)
- 获取ip地址 域名获取与解析
- 深度学习图像分类(三): VggNet
- 爬虫实战 -- QQ音乐爬取全部歌曲
- win7计算机怎么录屏,Win7系统屏幕录制功能在哪里?Win7系统屏幕录制功能的使用教程...
- photoshop2019及其破解器
- EMC Isilon(OneFS)数据恢复案例详解
- 华师大的计算机专业属于提前批吗,关于华师大、上师大提前批的问题
- python下载音乐代码_基于Python实现下载网易音乐代码实例
- 内存泄漏问题该如何解决-面试学习笔记
- 模糊的照片如何修复清晰?
- 真是没想到!原来微信还有这么厉害的翻译功能,一键轻松翻译
- 查询服务器主机CPU是几核?附应用场景展示(已解决)
- 学英语《每日一歌》之take me to your heart