Android自定义View实现自动吸附功能
时间:2022-07-27
本文章向大家介绍Android自定义View实现自动吸附功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了Android实现自动吸附功能的具体代码,供大家参考,具体内容如下
1.简述
最近开发app过程中要实现拖动view后要可以自动吸附功能,所以需要自定义view来在onTouchEvent中来利用动画来实现此功能
2.功能代码部分
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
public class AdsorbentViews extends ImageView {
private int maxWidth;
private int maxHeight;
private int viewWidth;
private int viewHeight;
private float downx;
private float downy;
private Context mContext;
public CustomViews(Context context) {
this(context, null);
}
public CustomViews(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomViews(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
DisplayMetrics outMetrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getRealMetrics(outMetrics);
//屏幕的宽度
maxWidth = outMetrics.widthPixels;
//屏幕的高度
maxHeight = outMetrics.heightPixels;
/**
* 控件的宽高
*/
viewWidth = canvas.getWidth();
viewHeight = canvas.getHeight();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
clearAnimation();
downx = event.getX();
downy = event.getY();
return true;
case MotionEvent.ACTION_MOVE:
float moveX = event.getRawX() - downx;
float moveY = event.getRawY() - downy;
moveX = moveX < 0 ? 0 : (moveX + viewWidth maxWidth) ? (maxWidth - viewWidth) : moveX;
moveY = moveY < 0 ? 0 : (moveY + viewHeight) maxHeight ? (maxHeight - viewHeight) : moveY;
this.setY(moveY);
this.setX(moveX);
return true;
case MotionEvent.ACTION_UP:
//做吸附效果
float centerX = getX() + viewWidth / 2;
if (centerX maxWidth/2){
//靠右吸附
animate().setInterpolator(new DecelerateInterpolator())
.setDuration(500)
.x(maxWidth-viewWidth)
.y(maxHeight-viewHeight)
.start();
}else {
animate().setInterpolator(new DecelerateInterpolator())
.setDuration(500)
.x(0)
.y(maxHeight-viewHeight)
.start();
}
return true;
default:
return super.onTouchEvent(event);
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 使用R语言构造投资组合
- R语言构建追涨杀跌量化交易模型
- 美团点评境外度假团队前端项目开发实践总结
- 在jfinal中使用druid,并配置查看权限
- java中遇到过的String的一些特性
- Kaggle案例——使用scikit-learn解决DigitRecognition问题
- 基于Kaggle数据的词袋模型文本分类教程
- javascript中遇到的字符串对象处理
- 传统企业站开发 - 页面布局
- AngularJS中使用service,并同步数据
- 2016.05 第四周 群问题分享
- angularjs中 *.min.js.map 404的问题
- Git与通过Git添加提交文件
- Facebook社交网络R语言分析
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- linux把一个文件的内容复制到另一个文件的末尾
- 详解linux下nohup日志输出过大问题解决方案
- K8S dashboard 2.0 安装配置并使用 ingress-nginx 访问
- linux模糊查找文件用什么命令比较好
- Ubuntu14.04服务器环境下配置PHP7.0+Apache2+Mysql5.7的方法
- Linux C 后台服务程序单进程控制的实现
- Linux下SSH免密码登录配置详解
- SSH端口转发实现内网穿透的实现
- 在linux中用同一个版本的R 同时安装 Seurat2 和 Seurat3的教程
- AUCell:在单细胞转录组中识别细胞对“基因集”的响应
- linux查看硬件配置命令的方法示例
- Ubuntu环境编译安装PHP和Nginx的方法
- Ubuntu环境源码编译安装xdebug的方法
- CNS图表复现07—原来这篇文章有两个单细胞表达矩阵
- CentOS 7.x 安装 ZSH 终端的配置方法