上一篇博客已经实现了一个固定view来展示碰撞算法—简单碰撞算法及其demo(屏幕气泡原理),今天做了一个相对负责的ViewGroup,即放在其中的每个view都可以自动去”飘动”!为其子view实现碰撞算法!
下面先看一下实现后的效果!
原理分析:
1.需自定义一个ViewGroup来存放所有的子view,但是每个子view的移动角度移动速度移动边界等信息是不同的,所以需要自定义一个helper类来存储每一个子view的移动范围,速度大小和速度方向以及位置信息!
2.根据子view的个数,在ViewGroup中新建helper对象.
3.不断更新每个子view的位置信息,在ViewGroup的onlayout中不断更新位置
代码实现过程:
1.新建一个ViewGroup来存放所有的子view
package com.example.automoveviewgroup;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
@SuppressLint("DrawAllocation")
public class AutoMoveViewGroup extends RelativeLayout {
private List<AutoMoveHelper> mAutoMoveHelpers;// 用于存放每一个子view对应的helper类
public AutoMoveViewGroup(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public AutoMoveViewGroup(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoMoveViewGroup(Context context) {
this(context, null);
}
private void init() {
mAutoMoveHelpers = new ArrayList<>();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int wideMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width, height;
if (wideMode == MeasureSpec.AT_MOST) {
width = 600;
} else {
width = MeasureSpec.getSize(widthMeasureSpec);
}
if (heightMode == MeasureSpec.AT_MOST) {
height = 600;
} else {
height = MeasureSpec.getSize(heightMeasureSpec);
}
setMeasuredDimension(width, height);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
requestLayout();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {