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的更多相关文章

  1. Android进阶篇-时间滑动控件

    仿Iphone时间选择滑动控件: WheelView.java: /** * @author Administrator * * 时间滑动滚轮 */ public class WheelView ex ...

  2. android 基础控件(EditView、SeekBar等)的属性及使用方法

        android提供了大量的UI控件,本文将介绍TextView.ImageView.Button.EditView.ProgressBar.SeekBar.ScrollView.WebView ...

  3. 矩阵, 矩阵 , Android基础控件之ImageView

    天下文章大家抄,以下所有内容,有来自copy,有来自查询,亦有自己的总结(目的是总结出自己的东西),所以说原创,不合适,说是转载也不恰当,所以我称之为笔记,可惜没有此分类选项,姑且不要脸一点,选择为原 ...

  4. 基于webview的选择滑动控件(PC和wap版)

    有了webview,大家开发ios或者安卓的app就方便很多啦. 第一可以增量更新: 第二webview可以同时兼容ios和安卓,减少开发量哦. --------------------------- ...

  5. Github上star数超1000的Android列表控件

    Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ...

  6. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  7. appium+python:自己写的一个滑动控件的方式

    #调用方式roll_ele("ID","ele_id","7","up",3)#将控件分为7格,从底部倒数第二格向上滑动 ...

  8. Android基本控件之Menus

    在我们的手机中有很多样式的菜单,比如:我们的短信界面,每条短信,我们长按都会出现一个菜单,还有很多的种类.那么现在,我们就来详细的讨论一下安卓中的菜单 Android的控件中就有这么一个,叫做Menu ...

  9. Android:控件布局(相对布局)RelativeLayout

    RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...

随机推荐

  1. 如何更换git托管

    有时候会遇到需要更换代码托管平台,从github,gitlab或者Bitbucket迁移到其它平台,过程中可能遇到不少问题,本文从是否保留历史提交记录两种需求出发,介绍一下基于git托管平台的迁移方法 ...

  2. tensorflow max_pool(最大池化)应用

    1.最大池化 max pooling是CNN当中的最大值池化操作,其实用法和卷积很类似. tf.nn.max_pool(value, ksize, strides, padding, name=Non ...

  3. [js] post 方式打开新窗口

    一.前因 一般我们是用 window.open(url,name,params); 打开新窗口, url 会携带一些参数, 但存在参数过多,引发url 过长截断,无法打开正确窗口, 所以我们需要使用 ...

  4. java中方法的参数传递机制

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...

  5. 打造 高性能,轻量级的 webform框架---js直接调后台(第二天)

    问题2: 每次与后台打交道 都需要写一些自己都看不太懂的事件,而且传参数很麻烦,这就是.net 封装的事件,如何解决呢?        首先以为webfrom事件,都需要写 服务器控件来绑定后台的事件 ...

  6. codeforces 475D. CGCDSSQ

    D. CGCDSSQ time limit per test 2 seconds memory limit per test 256 megabytes Given a sequence of int ...

  7. SpringBoot基础梳理

    1.入口类和@SpringBootApplication注解: SpringBoot通常有一个名为*Application的入口类,入口类里面有main方法,我们可以通过启动main方法启动sprin ...

  8. 安徽省2016“京胜杯”程序设计大赛_C_箭无虚发

    箭无虚发 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 128 Accepted: 21 Description      ...

  9. OpenGL与CUDA互操作方式总结

    一.介绍 CUDA是Nvidia推出的一个通用GPU计算平台,对于提升并行任务的效率非常有帮助.本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来.于是就尝试把 ...

  10. vue.js学习之组件(下篇)

    本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星! https://github.com/zwl-jasmine95/Vue_test 以下所有知 ...