没接触RxJava之前,初学Android之时,用原生控件ImageView写了个翻牌的小游戏。
但是有bug就是如果迅速点击相同的牌两下后将会计入错误中。
当时还不太了解怎么防止控件多次点击,当时的解决方案是第二次点击时对比一下上次点击控件的ID,如果一致则不计数。
现在有了RxJava,可以更简洁的实现这个功能。
看效果图:
防止多次代码:(两秒内只能点击该控件一次)
RxView.clicks(PictureBoxs[i]) .throttleFirst(2, TimeUnit.SECONDS) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Void>() { @Override public void call(Void avoid) {DoSomething();});
后台计时:
Observable.interval(1, TimeUnit.SECONDS) .compose(this.<Long>bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.newThread()) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { tvShow.setText("" + Integer.toString(alltime++));};
随机出6各不同的数字,赋值给数组num[0]-----num[5],
然后让num[0]---num[5]顺序打乱后的值赋给num[6]---num[11]。
这样 0---11 中就有6对相同的,且顺序是乱的。
然后呢。控件ImageView[12] 它们背后隐藏的值就是数组num中的值。
每2次点击后看看点击的控件对应的num[x]值是否相等。
相等就隐藏控件,不等就再把牌统一显示成背面并且错误次数+1.
很简单对吧~~~
控件消除的粒子效果是在Github上的,忘记地址了,很抱歉,但十分感谢作者。
关于随机数如何不同有很多方法,由于数组不大,可以直接两个for循环,也可以递归实现:
static int GetNumber(int[] a, int index, int minValue, int maxValue, int temp, Random r) { for (int i = 0; i < index; i++) { if (a[i] == temp) { int newTemp = r.nextInt(maxValue)+minValue; a[index] = newTemp; return GetNumber(a, index, minValue, maxValue, newTemp, r); } } return temp; }
github地址:https://github.com/VongVia1209/MemoryCard