先说下思路
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进行的回调。
剩下具体思路可以看代码。