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-- ...
 
随机推荐
- arcgis for javascript 自定义infowindow
			
arcgis 自己的infowindow 太难看了,放在系统中与系统中的风格格格不入,在参考了网上的一些资料后,整理编写了适合自己系统的infowindow,与大家分享. 1.自定义展示效果 2.In ...
 - 一步一步学Vue(八)
			
本篇完成如下场景: 1.系统包含首页.客户信息查询.登录三个模块 2.默认进入系统首页,如果要进行用户查询,则需要进行登录授权 3.查询用户后点击列表项,则进入详情页面 基于上述场景需求描述,在客户端 ...
 - JStorm与Storm源码分析(一)--nimbus-data
			
Nimbus里定义了一些共享数据结构,比如nimbus-data. nimbus-data结构里定义了很多公用的数据,请看下面代码: (defn nimbus-data [conf inimbus] ...
 - 微信小程序框架探究和解析
			
何为框架 你对微信小程序的技术框架了解多少? 对wepy 框架进行一系列的深入了解 微信小程序框架解析和探究 小程序组件化框架WePY 在性能调优上做出的探究 开发者培训班上海专场PPT分享:小程序框 ...
 - 在同一个sql语句中,统计不同条件的Count数量
			
前几天帮同事优化了个SQL,原写法使用多个子查询这里不再重现了,大家都遇到过这样一种情况,在项目后期的维护中, 修改别人的SQL代码,超过30行的语句,多层子查询,读起来很坑,时间久的项目伴随着人员的 ...
 - Eclipse常用快捷键大全1
			
Eclipse常用快捷键大全 1.ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字 ...
 - 聪明的质监员[NOIP2011]
			
时间限制:1 s 内存限制:128 MB [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检 ...
 - React Native 系列(一) -- JS入门知识
			
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
 - little bird
			
LITTLE BIRD Bzoj 3831 相对而言是一道比较简单的DP,不过它需要用单调队列优化.首先是朴素O(n2), if(d[j]>f[i]) f[i]=min(f[i],f[j]); ...
 - 终端管理软件tmux
			
tmux - terminal multiplexer 我们在服务器上进行操作,写代码,测试,运行服务,都会用到这样的工具,以前使用GNU screen,但是在最近使用了tmux之后,我觉得tmux真 ...