基于优先级队列写的一个SmartQueue(可控制多个线程的顺序执行、View的顺序显示):Android-SmartQueue
jopen
9年前
基于优先级队列写的一个SmartQueue(可控制多个线程的顺序执行、View的顺序显示),利用它可以轻松实现RecyclerView、ListView等Item的进入动画,网络请求线程的顺序执行。
其中和第一种方式一样先创建一个ViewPriorityQueue对象,其中ViewBuilder()中有两个参数,第一个是当前的Activity对象,第二个是实现一个ViewAnim接口(为null表示View的显示是默认的效果,或者自己实现这个接口自定义View的显示动画效果),这个addView()方法表示添加View,越先添加的View越先显示,所以你想让某个View最先显示你可以把它第一个添加。如下就是我自定义的一种动画效果:
效果:
Usage
多个线程顺序执行
你可以创建一个ThreadPriorityQueue对象,然后通过.run()方法让线程开始执行,创建ThreadPriorityQueue对象的时候,你可以通过addThread()方法添加线程,其中第一个参数是Thread对象,第二个参数是你自己设置线程的优先级(值范围是1~10,优先级越高线程越先执行,当设置的值不在这个范围则默认为1):
ThreadPriorityQueue mThreadPriorityQueue = new ThreadPriorityQueue.QueueBuilder() .addThread(thread1, 10).addThread(thread2, 9) .addThread(thread3, 8).addThread(thread4, 7) .addThread(thread5, 6).addThread(thread6, 5) .create(); mThreadPriorityQueue.run();
当你想停止线程的执行,你可以调用:
if(mThreadPriorityQueue!=null){ mThreadPriorityQueue.removeAll();//停止后续Thread任务 }
多个View的顺序显示
你可以添加任何的View,来控制它们的显示顺序,正如上面的效果一样,你可以控制Activity中布局的显示顺序,也可以控制列表项的显示,通过控制View的显示顺序你让界面不同的动画效果,如:
ViewPriorityQueue viewPriorityQueue = new ViewPriorityQueue.ViewBuilder(this,null).addView(views.get(3)).addView(views.get(5)).addView(views.get(4)).create(); //View的执行顺序是按addView()的顺序,越前表示越先显示 viewPriorityQueue.run();
其中和第一种方式一样先创建一个ViewPriorityQueue对象,其中ViewBuilder()中有两个参数,第一个是当前的Activity对象,第二个是实现一个ViewAnim接口(为null表示View的显示是默认的效果,或者自己实现这个接口自定义View的显示动画效果),这个addView()方法表示添加View,越先添加的View越先显示,所以你想让某个View最先显示你可以把它第一个添加。如下就是我自定义的一种动画效果:
ViewPriorityQueue viewPriorityQueue = new ViewPriorityQueue.ViewBuilder(new MainActivity(), new ViewAnim() { @Override public void beforeViewAnim(View view) { DisplayMetrics metrics = getResources().getDisplayMetrics(); view.setAlpha(0); view.animate().translationY(metrics.heightPixels).start(); } @Override public void runViewAnim(View view) { view.animate().alpha(1).translationY(0).setDuration(500).start(); } }).addView(views.get(0)).addView(views.get(7)).addView(views.get(1)).addView(views.get(6)).addView(views.get(2)).addView(views.get(3)).addView(views.get(5)).addView(views.get(4)).create(); viewPriorityQueue.run();
当然你也可以定义一个layout中的不同控件的显示顺序。