針對Android Tv的自定義RecyclerView2.0橫豎向連動

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請注明出處。

推薦:
歡迎關(guān)注我創(chuàng)建的Android TV 簡書專題,會定期給大家分享一些AndroidTv相關(guān)的內(nèi)容:
http://www.itdecent.cn/c/37efc6e9799b


前言:在上一篇針對Android Tv的自定義RecyclerView文章中介紹了橫向的RecyclerView一些用法和實(shí)現(xiàn)方法。在上一篇的基礎(chǔ)上,來實(shí)現(xiàn)RecyclerView橫向和縱向的連動效果。

首先上效果圖:

ezgif.com-gif-maker.gif

新的版本在上一個版本的基礎(chǔ)上添加了一些內(nèi)容以及讀者反饋的bug.具體添加的內(nèi)容如下:
1.添加了垂直的RecyclerView,并實(shí)現(xiàn)了可以控制橫向recyclerView的效果。
2.左右箭頭點(diǎn)擊后RecyclerView的條目不會獲得焦點(diǎn),解決了滑動沖突。
3.橫向RecyclerView5.0以下版本之后條目放上之后會出現(xiàn)被壓蓋的情況,這里修復(fù)了該bug。
4.在RecyclerView內(nèi)部不再提供類似于放大抬高z軸的操作,這里只提供了focus狀態(tài)的接口,具體的邏輯在RecyclerView使用處提供回調(diào)。

實(shí)現(xiàn)

下面具體來分析一下。
1.這里豎直的RecyclerView是在popupWindow中展示的。

  View popupView = getLayoutInflater().inflate(R.layout.list_menu_popwindow, null, false);
  mPopRecyclerView = (CustomRecyclerView)  popupView.findViewById(R.id.recycler_view);
  mUpArr = (ImageButton) popupView.findViewById(R.id.up_arrow);
  mDownArr = (ImageButton) popupView.findViewById(R.id.down_arrow);
  mPopupWindow = new PopupWindow(popupView, 404, 1920);
  mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#F8F8F8")));
  mPopupWindow.setFocusable(true);
  mPopupWindow.setOutsideTouchable(true);
  mPopupWindow.update();

注意:popupWindow要設(shè)置背景。
在popupWindow進(jìn)入的時候我添加了一個進(jìn)入的動畫:

  mPopRecyclerView.setLayoutAnimation(PopLayoutAnimation.orderAnimation());

PopLayoutAnimation相關(guān)代碼如下:

public class PopLayoutAnimation {
    private static Animation transAnim, alphaAnim;
    static LayoutAnimationController controller;

    public static LayoutAnimationController orderAnimation() {
        LayoutAnimationController controller;
        Animation transAnim, alphaAnim;
        AnimationSet set = new AnimationSet(false);
        transAnim = new TranslateAnimation(0, 0, -50, 0);
        transAnim.setDuration(167);
        transAnim.setFillEnabled(true);
        transAnim.setFillAfter(true);

        alphaAnim = new AlphaAnimation(0, 1);
        alphaAnim.setDuration(167);
        alphaAnim.setFillAfter(true);
        set.addAnimation(transAnim);
        set.addAnimation(alphaAnim);
        controller = new LayoutAnimationController(set, 1);
        controller.setDelay(0.33f);
        return controller;
    }

    public static LayoutAnimationController reserverAnimation(){
        AnimationSet set = new AnimationSet(false);
        transAnim = new TranslateAnimation(0, 0,50, 0);
        transAnim.setDuration(167);
        transAnim.setFillEnabled(true);
        transAnim.setFillAfter(true);
        // transAnim.setFillBefore(true);
        alphaAnim = new AlphaAnimation(0,1);
        alphaAnim.setDuration(167);
        alphaAnim.setFillAfter(true);
        set.addAnimation(transAnim);
        set.addAnimation(alphaAnim);
        controller = new LayoutAnimationController(set, 1);
        controller.setDelay(0.33f);
         controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
        return controller;
    }
    public static boolean isNullAnimation(){
        if (controller==null||controller.isDone()){
            return true;
        }
        else{
            return false;
        }
    }
    public static void resetAnimation(){
        controller.start();
    }
}

2.橫向的RecyclerView在使用的過程中發(fā)現(xiàn)在滾動的時候,鼠標(biāo)放到Item上RecyclerView為了響應(yīng)item獲取焦點(diǎn)事件會停止?jié)L動,達(dá)不到翻頁的效果。這里處理了item響應(yīng)時機(jī)。在RecyclerView處于idle狀態(tài)時去響應(yīng)。

 holder.itemView.setOnHoverListener(new View.OnHoverListener() {
                @Override
                public boolean onHover(View v, MotionEvent event) {
                    int what = event.getAction();
                    switch (what) {
                        case MotionEvent.ACTION_HOVER_ENTER:
                            RecyclerView recyclerView = (RecyclerView) holder.itemView.getParent();
                            int[] location = new int[2];
                            recyclerView.getLocationOnScreen(location);
                            int x = location[0];
//                            LogUtil.i("swj","GalleryAdapter.onHover.x="+x +",width = "+(recyclerView.getWidth()+x));
                            //為了防止?jié)L動沖突,在滾動時候,獲取焦點(diǎn)為了顯示全,會回滾,這樣會導(dǎo)致滾動停止
                            if (recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_IDLE) {
                                //當(dāng)超出RecyclerView的邊緣時不去響應(yīng)滾動
                                if (event.getRawX() > recyclerView.getWidth() + x || event.getRawX() < x) {
                                    return true;
                                }
                                //鼠標(biāo)進(jìn)入view,爭取到焦點(diǎn)
                                v.requestFocusFromTouch();
                                v.requestFocus();
//                                LogUtil.i(this,"HomeTvAdapter.onHover.position:"+position);
                                focusStatus(v, position);
                            }
                            break;
                        case MotionEvent.ACTION_HOVER_MOVE:  //鼠標(biāo)在view上移動
                            break;
                        case MotionEvent.ACTION_HOVER_EXIT:  //鼠標(biāo)離開view
                            normalStatus(v, position);
                            break;
                    }
                    return false;
                }
            });

3.橫向RecyclerView在Android5.0以后的系統(tǒng),item在hover態(tài)時是抬高z軸,5.0以下版本之后條目放上之后會出現(xiàn)被壓蓋的情況,這里調(diào)整了一下布局。達(dá)到了兼容。

結(jié)束:

這里的RecyclerView用法和普通的RecyclerView用法類似,至于布局的顯示,可以根據(jù)自己的項(xiàng)目去定義。
項(xiàng)目的地址:https://github.com/songwenju/CustomTvRecyclerView
如果對你有幫助,歡迎star和fork。如有問題,歡迎反饋交流。


推薦:
歡迎關(guān)注我創(chuàng)建的Android TV 簡書專題,會定期給大家分享一些AndroidTv相關(guān)的內(nèi)容:
http://www.itdecent.cn/c/37efc6e9799b

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,160評論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,166評論 22 665
  • 抽屜菜單 MaterialDrawer★7337 - 安卓抽屜效果實(shí)現(xiàn)方案 Side-Menu.Android★3...
    彬哥狠逍遙閱讀 6,000評論 4 59
  • 其實(shí)在很早的時候就有了寫這么一篇文章的打算,只是無奈于寫作靈感這回事,一直遲遲無法下筆。都說靈感來源于生活,我想是...
    卜默閱讀 1,888評論 26 42
  • 雖然聽不到聲音,單幾個畫面,幾行文字,就觸動了我的思緒,回憶如潮水般涌來,淚水一滴滴落在衣服上。既然擦不凈...
    艾同同閱讀 1,126評論 5 8

友情鏈接更多精彩內(nèi)容