先说下思路
1.如何让小球不重叠分布?
2.小球上下移动这个可以具体看原文作者分析
本文主要分析第一点
刚开始想法是,每次随机生成一个x,y位置,但是这保证不了小球重叠的问题。
然后受到原文作者启发,其实我们可以固定前面6个小球的位置,让它们处于屏幕中心,然后剩余的4个小球再随机的从我们定义好的位置中获取。
这样就能保证10个小球既不会重叠,也不会偏离屏幕中心太远。
private List<Float> xCanChooseList = Arrays.asList(
0.35f, 0.55f, 0.32f, 0.52f, 0.72f, 0.78f, 0.15f, 0.63f, 0.20f,
0.30f, 0.47f, 0.21f, 0.76f, 0.65f, 0.38f);
private List<Float> yCanChooseList = Arrays.asList(
0.36f, 0.45f, 0.50f, 0.28f, 0.33f, 0.50f, 0.40f, 0.63f, 0.62f,
0.75f, 0.57f, 0.20f, 0.70f, 0.17f, 0.21f);
这些是固定好的位置,不会重叠,前面6个都处于屏幕中心,剩下的则处于屏幕上下方,这样能保证用户每次进来不会都一样。
private void setViewLocation(View view, int i) {
int randomInt = 0;
if (i >= 6) {
randomInt = mRandom.nextInt(xCurrentList.size());
}
float x = xCurrentList.get(randomInt) * width;
view.setX(x);
float y = yCurrentList.get(randomInt) * height;
view.setY(y);
LogUtils.e("randomInt=" + randomInt + "设置的x位置是" + xCurrentList.get(randomInt) + "y轴位置是" + yCurrentList.get(randomInt));
view.setTag(R.string.string_origin_location, (float) y);
view.setTag(R.string.string_origin_direction, mRandom.nextBoolean());
view.setTag(R.string.string_origin_spe, randomSpeed.get(mRandom.nextInt(randomSpeed.size())));
xCurrentList.remove(randomInt);
yCurrentList.remove(randomInt);
}
设置小球的位置,设置完之后,需要立马删除。
public interface OnStopAnimateListener {
void onBallDisappearAnimListener(String number);
void onExitAnimateListener();
}
添加了两个动画执行完成的方法,第一个是某一个小球执行完动画的回调,第二个是用户退出整个Activity进行的回调。
剩下具体思路可以看代码。