Android滑动控件.md
1.概述
最近写代码临时加了个功能主要是滑动选择的功能效果图如下:

2.代码
这里主要是用属性动画做的
<ImageButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_margin="@dimen/fab"
    android:background="@drawable/selector_add_fab"
    android:clickable="true" />
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 获得焦点但未按下时的背景图片 -->
    <item android:drawable="@drawable/add_fab" android:state_enabled="true" android:state_focused="false" android:state_pressed="false" />
    <item android:drawable="@drawable/add_fab_un" android:state_enabled="false" android:textColor="@color/white" />
    <!-- 按下时的背景图片 -->
    <item android:drawable="@drawable/add_fab_un" android:state_enabled="true" android:state_pressed="true" />
    <item android:drawable="@drawable/add_fab_un" android:state_enabled="true" android:state_focused="true" />
</selector>
private void setImageButtonTouch() {
    DisplayMetrics dm = getResources().getDisplayMetrics();
    screenWidth = dm.widthPixels;
    screenHeight = dm.heightPixels - DensityUtil.dpToPx(activity, 70);
    fb.setOnTouchListener(new View.OnTouchListener() {
        float lastX = 0;
        float lastY = 0;
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d(TAG, "ontouch" + event.getActionMasked());
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = event.getRawX();
                    lastY = event.getRawY();
                    isDrag = false;
                    break;
                case MotionEvent.ACTION_MOVE:
                    //  不要直接用getX和getY,这两个获取的数据已经是经过处理的,容易出现图片抖动的情况
                    isDrag = true;
                    float distanceX = lastX - event.getRawX();
                    float distanceY = lastY - event.getRawY();
                    float nextY = fb.getY() - distanceY;
                    float nextX = fb.getX() - distanceX;
                    // 不能移出屏幕
                    if (nextY < 0) {
                        nextY = 0;
                    } else if (nextY > screenHeight - fb.getHeight()) {
                        nextY = screenHeight - fb.getHeight();
                    }
                    if (nextX < 0)
                        nextX = 0;
                    else if (nextX > screenWidth - fb.getWidth())
                        nextX = screenWidth - fb.getWidth();
                    // 属性动画移动
                    ObjectAnimator y = ObjectAnimator.ofFloat(fb, "y", fb.getY(), nextY);
                    ObjectAnimator x = ObjectAnimator.ofFloat(fb, "x", fb.getX(), nextX);
                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.playTogether(x, y);
                    animatorSet.setDuration(0);
                    animatorSet.start();
                    lastX = event.getRawX();
                    lastY = event.getRawY();
                    break;
                case MotionEvent.ACTION_UP:
                    if (!isDrag) {
                        startActivity(new Intent(activity, OtherActivity.class));
                    }
                    break;
            }
            return false;
        }
    });
}
3.踩坑
这里有个需要注意的是我一开始用的是
view.layout(上,下,左,右)设置位置,这样实际上是改变不了他的实际位置,只能改变视图,每次数据刷新或者点击原来位置都会恢复到原来的位置
         case MotionEvent.ACTION_MOVE:
               int dx = (int) event.getRawX() - lastX;
               int dy = (int) event.getRawY() - lastY;
               int l = v.getLeft() + dx;
               int b = v.getBottom() + dy;
               int r = v.getRight() + dx;
               int t = v.getTop() + dy;
               // 下面判断移动是否超出屏幕
                if (l < 0) {
                    l = 0;
                   r = l + v.getWidth();
                }
                if (t < 0) {
                  t = 0;
                    b = t + v.getHeight();
                }
                if (r > screenWidth) {
                    r = screenWidth;
                    l = r - v.getWidth();
                }
                if (b > screenHeight) {
                    b = screenHeight;
                   t = b - v.getHeight();
               }
                 v.layout(l, t, r, b);
                 lastX = (int) event.getRawX();
                 lastY = (int) event.getRawY();
Android滑动控件.md的更多相关文章
- Android进阶篇-时间滑动控件
		仿Iphone时间选择滑动控件: WheelView.java: /** * @author Administrator * * 时间滑动滚轮 */ public class WheelView ex ... 
- android 基础控件(EditView、SeekBar等)的属性及使用方法
		android提供了大量的UI控件,本文将介绍TextView.ImageView.Button.EditView.ProgressBar.SeekBar.ScrollView.WebView ... 
- 矩阵, 矩阵  , Android基础控件之ImageView
		天下文章大家抄,以下所有内容,有来自copy,有来自查询,亦有自己的总结(目的是总结出自己的东西),所以说原创,不合适,说是转载也不恰当,所以我称之为笔记,可惜没有此分类选项,姑且不要脸一点,选择为原 ... 
- 基于webview的选择滑动控件(PC和wap版)
		有了webview,大家开发ios或者安卓的app就方便很多啦. 第一可以增量更新: 第二webview可以同时兼容ios和安卓,减少开发量哦. --------------------------- ... 
- Github上star数超1000的Android列表控件
		Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ... 
- Android 开源控件与常用开发框架开发工具类
		Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ... 
- appium+python:自己写的一个滑动控件的方式
		#调用方式roll_ele("ID","ele_id","7","up",3)#将控件分为7格,从底部倒数第二格向上滑动 ... 
- Android基本控件之Menus
		在我们的手机中有很多样式的菜单,比如:我们的短信界面,每条短信,我们长按都会出现一个菜单,还有很多的种类.那么现在,我们就来详细的讨论一下安卓中的菜单 Android的控件中就有这么一个,叫做Menu ... 
- Android:控件布局(相对布局)RelativeLayout
		RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ... 
随机推荐
- 禁止UIWebView随键盘的弹起而往上滚动
			问题:当UIWebView中的html有输入框,点击输入框,UIWebView会随键盘的弹起而整体往上移动,收起键盘后,UIWebView无法回到原来的位置; 问题的原因:由于UIWebView继承的 ... 
- iOS开发实战-时光记账Demo 网络版
			之前写了一个本地数据库版本 戳这里 现在这个就是增加了后台 登录注册页面以及web的上传记录展示页面 含有少量php有兴趣可以看下 另外demo中包括数据库操作.json.网络请求等都没有用到第三方库 ... 
- IT软件管理人员的职业路线(从技术经理到总经理) - CEO之公司管理经验谈
			技术.业务和管理永远是工作的一个话题.笔者今天就根据自身的经验,通过这三个方面介绍下IT软件管理人员的职业路线.前面写过一个文(IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈), ... 
- 【javascript】回调函数
			1. 定义 回调函数,即当条件满足时执行的函数.有三种方法实现调用回调函数 call 1)call 用法:call(thisObj, Obj) 主要区别:call 方法会将函数对象上下文修改为this ... 
- 高效搭建lnmp环境
			1:安装nginx sudo apt-get install nginx 检测 nginx : sudo nginx -t 出现如下表示成功 2:安装配置m ... 
- Selenium+java操作浏览器cookies
			描述:登录CSDN,将登录信息cookies保存到文件,再次打开网页时,直接利用文件中的数据登录. 1. 获取cookies并保存到文件 步骤: ① 打开CSDN的登录界面: ② 填写用户名和密码: ... 
- HDU--1358--KMP算法失配函数getfail()的理解--Period
			/* Name: hdu--1358--Period Author: 日天大帝 Date: 20/04/17 10:24 Description: 长度/向后移动的位数 = 出现的次数 kmp其实匹配 ... 
- ACM退役帖 -- 未真正开始也不会结束
			2017.5.21,20岁的最后一天,昨天,随着2017年安徽省大学生程序设计竞赛落下帷幕,我也正式退役了ACM了.连ACM区域赛也没去过的我,也许是不够格提出退役ACM这句话的,但对ACM的热爱,虽 ... 
- Python requests 安装与开发
			Requests 是用Python语言编写HTTP客户端库,跟urllib.urllib2类似,基于 urllib,但比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求, ... 
- HBase集群安装部署
			0x01 软件环境 OS: CentOS6.5 x64 java: jdk1.8.0_111 hadoop: hadoop-2.5.2 hbase: hbase-0.98.24 0x02 集群概况 I ... 
