工作内容;

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相关推荐

  1. Android自定义Seekbar拖动条式样

    SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...

  2. Android学习笔记18:自定义Seekbar拖动条式样

    SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...

  3. android md 控件,Android基本UI控件.md

    # Android基本UI控件 ## *TextView 文本框* ### TextView常用用法 | 主要方法 | 功能描述 | | :----------: | :--------------- ...

  4. Android 打造完美的侧滑菜单/侧滑View控件

    概述 Android 打造完美的侧滑菜单/侧滑View控件,完全自定义实现,支持左右两个方向弹出,代码高度简洁流畅,兼容性高,控件实用方便. 详细 代码下载:http://www.demodashi. ...

  5. 视频教程-Android Material Design 新控件-Android

    Android Material Design 新控件 刘志远,北京邮电大学硕士研究生, 北京育华志远科技有限公司创始人, 育华志远教育品牌负责人,育华志远课程体系打造者. 率领团队为互联网行业培训千 ...

  6. 如何在Android实现桌面清理内存简单Widget小控件

    如何在Android实现桌面清理内存简单Widget小控件 我们经常会看到类似于360.金山手机卫士一类的软件会带一个widget小控件,显示在桌面上,上面会显示现有内存大小,然后会带一个按键功能来一 ...

  7. android开发重要控件,Android界面编程——Android基本控件

    Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...

  8. Android之横向滑动的广告(网格控件)

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53264494 本文出自:[顾林海的博客] ##前言 很早以前写过一篇自 ...

  9. android悬浮窗按钮在哪,android——悬浮窗控件Toast

    前端 后端 Toast 是一个悬浮窗控件,在不影响用户操作的条件下,按动按钮显示悬浮窗. 不同的是,Toast不支持点击事件,需要函数调用.所以要在外部函数初始化我们按钮的 控件,当我们的对象V创建出 ...

  10. android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能

    本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能.分享给大家供大家参考,具体如下: 工具类 ... public static void hideKeyboard(Co ...

最新文章

  1. 三、RabbitMQ安装
  2. Android使用ActivityGroup设置android:windowSoftInputMode失效的问题
  3. 最全面的JVM G1学习笔记
  4. asp.net页面中hmtl注释的问题
  5. java 方法 示例_Java扫描器具有示例的NextNextShort()方法
  6. vconfig命令打通直连网络
  7. 快速傅里叶变换学习笔记(更新中)
  8. 获取ip地址 域名获取与解析
  9. 深度学习图像分类(三): VggNet
  10. 爬虫实战 -- QQ音乐爬取全部歌曲
  11. win7计算机怎么录屏,Win7系统屏幕录制功能在哪里?Win7系统屏幕录制功能的使用教程...
  12. photoshop2019及其破解器
  13. EMC Isilon(OneFS)数据恢复案例详解
  14. 华师大的计算机专业属于提前批吗,关于华师大、上师大提前批的问题
  15. python下载音乐代码_基于Python实现下载网易音乐代码实例
  16. 内存泄漏问题该如何解决-面试学习笔记
  17. 模糊的照片如何修复清晰?
  18. 真是没想到!原来微信还有这么厉害的翻译功能,一键轻松翻译
  19. 查询服务器主机CPU是几核?附应用场景展示(已解决)
  20. 学英语《每日一歌》之take me to your heart

热门文章

  1. 菜鸟和老鸟都无法避免的问题——未将对象引用设置到对象的实例
  2. 硬盘保修期网上轻松查询
  3. mysql substr 中文乱码_substr()乱码
  4. OAuth2通过token访问资源服务器
  5. Wincc报表教程(SQL数据库的建立,wincc在数据库中保存和查询数据,调用Excel模板把数据保存到指定的位置和打印功能)
  6. Qt QTreeView 详解
  7. 新北京交通限行时间、尾号查询
  8. Android车载方案公司,你该何去何从?
  9. Android好用的音乐,安卓手机音乐播放器哪个好用?十大最好音乐播放器介绍
  10. 浅谈toB交付质量体系建设