Android自定义控件带弹性
来源:互联网 发布:刘德华 17岁 知乎 编辑:程序博客网 时间:2024/05/02 00:40
这里直接写出有效部分的代码:
**重点内容**
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = getLayoutInflater().inflate(R.layout.activity_main, null);
view.setOnTouchListener(new ElasticTouchListener());
setContentView(view);
}
public class ElasticTouchListener implements OnTouchListener {
private View inner;
View[] children;
private float y;
private Rect normal = new Rect();
private boolean animationFinish = true;
private int[] tops;
private int[] bottoms;
@Override
public boolean onTouch(View v, MotionEvent ev) {
if (inner == null && children == null) {
if (v instanceof ViewGroup) {
ViewGroup group = (ViewGroup) v;
int count = group.getChildCount();
if (count > 0) {
children = new View[count];
tops = new int[count];
bottoms = new int[count];
for (int i = 0; i < count; i++) {
children[i] = group.getChildAt(i);
tops[i] = children[i].getTop();
bottoms[i] = children[i].getBottom();
}
}
}
inner = v;
}
if (animationFinish && (inner != null || children != null)) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// System.out.println("ACTION_DOWN");
y = ev.getY();
break;
case MotionEvent.ACTION_UP:
// System.out.println("ACTION_UP");
y = 0;
if (isNeedAnimation()) {
animation();
}
inner.invalidate();
break;
case MotionEvent.ACTION_MOVE:
// System.out.println("ACTION_MOVE");
final float preY = y == 0 ? ev.getY() : y;
float nowY = ev.getY();
int deltaY = (int) (preY - nowY);
y = nowY;
// 当滚动到最上或者最下时就不会再滚动,这时移动布局
if (isNeedMove()) {
if (normal.isEmpty()) {
// 保存正常的布局位置
normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());
}
if (children != null) {
View view = null;
for (int i = 0; i < children.length; i++) {
view = children[i];
view.layout(view.getLeft(), view.getTop() - deltaY / 2, view.getRight(), view.getBottom() - deltaY / 2);
}
} else {
// 移动布局
inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);
}
}
inner.invalidate();
break;
default:
break;
}
} else {
return false;
}
return true;
}
// 开启动画移动
public void animation() {
if (children == null) {
// 开启移动动画
TranslateAnimation trans = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());
trans.setDuration(200);
trans.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
animationFinish = false;
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
inner.clearAnimation();
// 设置回到正常的布局位置
inner.layout(normal.left, normal.top, normal.right, normal.bottom);
normal.setEmpty();
animationFinish = true;
}
});
inner.startAnimation(trans);
} else {
for (int i = 0; i < children.length; i++) {
final View view = children[i];
if (view.getVisibility() == View.VISIBLE) {
final int index = i;
// 开启移动动画
TranslateAnimation trans = new TranslateAnimation(0, 0, 0, tops[i] - view.getTop());
trans.setDuration(200);
trans.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
animationFinish = false;
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
view.clearAnimation();
// 设置回到正常的布局位置
view.layout(view.getLeft(), tops[index], view.getRight(), bottoms[index]);
normal.setEmpty();
animationFinish = true;
}
});
view.startAnimation(trans);
}
}
}
}
// 是否需要开启动画
public boolean isNeedAnimation() {
return !normal.isEmpty();
}
// 是否需要移动布局
public boolean isNeedMove() {
// int offset = inner.getMeasuredHeight() - getHeight();
// int scrollY = getScrollY();
// if (scrollY == 0 || scrollY == offset) {
// return true;
// }
// return false;
// if (children != null && children.length > 0
// && (children[children.length - 1].getBottom() <= inner.getPaddingTop()/*inner.getTop()*/
// || children[0].getTop() >= inner.getHeight()
// )) {
// return false;
// }
return true;
}
}
- Android自定义控件带弹性
- Android 自定义控件实现弹性旋转的圆形菜单
- Android自定义弹性ScrollView
- 实现带3D弹性效果的ViewPager(非自定义控件)
- Android带弹性的View
- android自定义带倒影的ImageView控件
- Android自定义带消息提醒控件
- Android自定义控件 -- 带边框的TextView
- Android带日程安排的自定义日历控件
- Android EditText 自定义控件 带消除功能
- android自定义带动画的柱状图控件
- android自定义控件Button 带图片文字
- android 自定义弹性的ListView
- android自定义控件(组合控件)--带删除按钮的EditText
- 【组合控件】android自定义控件之带文字的ImageView
- Android 自定义控件/带资源的控件打包jar问题
- Android自定义控件(四)——让每一个Activity UI都具有弹性
- Android自定义控件_让每一个Activity UI都具有弹性
- JavaSE基础知识学习—集合之LinkList
- Git之命令总结
- 记录一下自己32位win7安装Android Studio2.33遇到的问题
- windows下修改终端编码
- Spring-boot-Mybatis-Starter
- Android自定义控件带弹性
- Revit二次开发之向Revit窗体发送虚拟按键
- HTML用JS导出Excel的五种方法
- python描述二叉树
- 网路互联参考模型 存档理解
- 基于DJI-OSDK-ROS 3.4版本demo_camera_gimbal.cpp程序阅读注释
- 分布式事务
- 吃货告诉你,PAAS、IAAS和SAAS之间的区别
- chars拦截到response乱码问题