KJframeforandroid框架之 KJBlog学习(三):

来源:互联网 发布:山西东华软件 编辑:程序博客网 时间:2024/06/06 01:28

   大家好,继续KJframeforandroid框架的学习。我们是对KJBlog开源项目的学习。

  进入到KJBlog的主界面之后。

   


  这里先讲这个主界面的一个小功能,就是单击返回键,然后最上面的title的文字“爱看博客”会变成“再次点击返回键切换到桌面”。而且是有动画效果的,然后如果小段时间内再点击返回键,会退出程序,但是如果过了一小段时间也没再按返回键,title上面的字就会再变成“爱看博客”。而且字在变化的时候是有动画效果的,比如“爱看博客”向下移动,然后“再次点击返回键切换到桌面”向上移动。

         

 protected final Handler mMainLoopHandler = new Handler(            Looper.getMainLooper());private boolean isOnKeyBacking;private final Runnable onBackTimeRunnable = new Runnable() {        @Override        public void run() {            isOnKeyBacking = false;            cancleExit();        }    };    @Override    public boolean onKeyDown(int keyCode, android.view.KeyEvent event) {        if (keyCode == KeyEvent.KEYCODE_BACK) {            if (isOnKeyBacking) {                mMainLoopHandler.removeCallbacks(onBackTimeRunnable);                isOnKeyBacking = false;                // UIHelper.toHome(aty);                KJActivityStack.create().AppExit(aty);            } else {                isOnKeyBacking = true;                showExitTip();                mMainLoopHandler.postDelayed(onBackTimeRunnable, 2000);            }            return true;            // } else if (keyCode == KeyEvent.KEYCODE_MENU) {            // return true;        } else {            return super.onKeyDown(keyCode, event);        }    };

   可以看出我们自定义一个boolean值变量isOnKeyBacking,默认是false,在监听KeyEvent.KEYCODE_BACK,第一次按下返回键的时候,因为isOnKeyBacking是false,所以会执行

                isOnKeyBacking = true;                showExitTip();                mMainLoopHandler.postDelayed(onBackTimeRunnable, 2000);
我们把isOnKeyBacking 设置为true,执行showExitTip( ) ,这个方法就是等会内容“爱看博客”会变成“再次点击返回键切换到桌面”的方法,后面具体分析。

然后再运行一个Runnable,并且延迟2秒。如果用户在2秒之内,再次按了返回键,因为这时候的isOnKeyBacking = true; 

所以执行

KJActivityStack.create().AppExit(aty);

其中KJActivityStack.java也是框架中一个封装类。

org.kymjs.kjframe.ui

Class KJActivityStack

  • java.lang.Object
    • org.kymjs.kjframe.ui.KJActivityStack


  • public final class KJActivityStackextends java.lang.Object
    应用程序Activity管理类:用于Activity管理和应用程序退出

Modifier and TypeMethod and DescriptionvoidaddActivity(I_KJActivity activity)

添加Activity到栈
voidAppExit(Context context)
应用程序退出
static KJActivityStackcreate() ActivityfindActivity(java.lang.Class<?> cls)
获取当前Activity(栈顶Activity) 没有找到则返回null
voidfinishActivity()
结束当前Activity(栈顶Activity)
voidfinishActivity(Activity activity)
结束指定的Activity(重载)
voidfinishAllActivity()
结束所有Activity
voidfinishOthersActivity(java.lang.Class<?> cls)
关闭除了指定activity以外的全部activity 如果cls不存在于栈中,则栈全部清空
intgetCount()
获取当前Activity栈中元素个数
ActivitytopActivity()
获取当前Activity(栈顶Activity)

   】


这样就退出了应用程序了。

如果在2秒中之内没有再按返回键,则刚延迟2秒执行的Runnable就开始执行

  public void run() {            isOnKeyBacking = false;            cancleExit();        }
这时候就把isOnKeyBacking = false.所以你2秒之后再按返回键的时候isOnKeyBacking又变false了,而cancleExit( ) 是把内容“再次点击返回键切换到桌面”变成“爱看博客”的方法。从而只是相当于第一次按返回键。不会退出。

而动画切换的方法:

  /**     * 取消退出     */    private void cancleExit() {        Animation anim = KJAnimations.getTranslateAnimation(0, 0,                titleBarHeight, 0, 300);        mTvTitle.startAnimation(anim);        Animation anim2 = KJAnimations.getTranslateAnimation(0, 0,0,                titleBarHeight, 300);        anim2.setAnimationListener(new AnimationListener() {            @Override            public void onAnimationStart(Animation animation) {}            @Override            public void onAnimationRepeat(Animation animation) {}            @Override            public void onAnimationEnd(Animation animation) {                mTvDoubleClickTip.setVisibility(View.GONE);            }        });        mTvDoubleClickTip.startAnimation(anim2);    }    /**     * 显示退出提示     */    private void showExitTip() {        mTvDoubleClickTip.setVisibility(View.VISIBLE);        Animation anim = KJAnimations.getTranslateAnimation(0, 0, 0,                titleBarHeight, 300);        mTvTitle.startAnimation(anim);        Animation anim2 = KJAnimations.getTranslateAnimation(0, 0,                titleBarHeight, 0, 300);        mTvDoubleClickTip.startAnimation(anim2);    }

其实说白了就是。那个位置本来就有二个TextView,比如“爱看博客”是mTvTitle。“再次点击返回键切换到桌面”是mTvDoubleClickTip。然后mTvDoubleClickTip默认不可见(View.GONE),然后当第一次点击返回键的时候,让mTvDoubleClickTip可见,并且执行位移动画。在Y轴从45 到 0;也就形成了从下到上的动画。然后mTvTitle是执行位移从0到45。也就形成了从上到下的动画。而且会被中间的列表布局挡住,看不到的。当你2秒之后不再按返回键,则mTvDoubleClickTip和mTvTitle执行刚才相反的位置动画,然后mTvDoubleClickTip设置View.GONE。


(KJAnimations.java介绍在第一篇KJframeforandroid框架之 KJBlog学习(一)博客里面有提到。)




0 0