Android TV首页横向滑动实现

Android TV首页横向滑动实现

在TV项目开发中,经常会用到横向滑动的布局,这里一次介绍下横向滑动的实现方式,请自行获取。

1.使用HorizontalGridView实现横向滑动
直接上代码

public class Main1Activity extends Activity {

    HorizontalGridView mHgv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);

        mHgv = this.findViewById(R.id.hgv);
        mHgv.setNumRows(1);
        //item纵向和横向的距离
        mHgv.setItemSpacing(20);
        //item的对齐方式
        mHgv.setGravity(Gravity.CENTER_VERTICAL);
        //设置
        mHgv.setOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
            @Override
            public void onChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child, int position, int subposition) {
                super.onChildViewHolderSelected(parent, child, position, subposition);
                //大部分情况下可以通过该方法获取到position
                Log.d("Main1Activity_1", position + "");
            }

            @Override
            public void onChildViewHolderSelectedAndPositioned(RecyclerView parent, RecyclerView.ViewHolder child, int position, int subposition) {
                super.onChildViewHolderSelectedAndPositioned(parent, child, position, subposition);
                //当通过setSelectedPosition()方法大幅移动列表时,该方法会回调,返回的是最终的真实的position(当set的值超出范围时...)
                Log.d("Main1Activity_2", position + "");
            }
        });

        HPresenter presenter = new HPresenter();
        //创建ObjectAdapter,用于提供数据,当有多种类型时,传入PresenterSelector
        ArrayObjectAdapter objectAdapter=new ArrayObjectAdapter(presenter);


        List<String> stringList = new ArrayList<>();
        stringList.add("1111");
        stringList.add("2222");
        stringList.add("3333");
        stringList.add("4444");
        stringList.add("5555");
        stringList.add("6666");
        stringList.add("7777");

        //添加数据
        objectAdapter.addAll(0, stringList);
        //通过前面创建的objectAdapter创建ItemBridgeAdapter,完成数据的传递
        ItemBridgeAdapter bridgeAdapter = new ItemBridgeAdapter(objectAdapter);
        //将ItemBridgeAdapter传入HorizontalGridView
        mHgv.setAdapter(bridgeAdapter);
        //设置上焦动画
        FocusHighlightHelper.setupHeaderItemFocusHighlight(bridgeAdapter);

    }
}

2.使用HorizontalScrollView实现

CustomScrollView h_scrollView;
    LinearLayout h_LinearLayout;
    MainUpView mainUpView;

    protected float scale = 1.1f;
    protected OpenEffectBridge mSavebridge;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_main_menu1);

        h_scrollView = findViewById(R.id.h_scrollView);
        h_LinearLayout = findViewById(R.id.h_LinearLayout);
        RelativeLayout item1 = findViewById(R.id.item1);
        RelativeLayout item2 = findViewById(R.id.item2);
        RelativeLayout item3 = findViewById(R.id.item3);
        RelativeLayout item4 = findViewById(R.id.item4);
        RelativeLayout item5 = findViewById(R.id.item5);
//        item1.setOnFocusChangeListener(this);
//        item2.setOnFocusChangeListener(this);
//        item3.setOnFocusChangeListener(this);
//        item4.setOnFocusChangeListener(this);
//        item5.setOnFocusChangeListener(this);

        mainUpView = (MainUpView) findViewById(R.id.mainUpView1);
        // 建议使用 noDrawBridge.
        mainUpView.setEffectBridge(new EffectNoDrawBridge()); // 4.3以下版本边框移动.
        mainUpView.setUpRectResource(R.drawable.white_changfang_shape); // 设置移动边框的图片.
        //mainUpView.setDrawUpRectPadding(new Rect(12,14,14,14)); // 边框图片设置间距.
        mainUpView.setDrawUpRectPadding(new Rect(3, 3, 3, 3)); // 边框图片设置间距.
        EffectNoDrawBridge bridget = (EffectNoDrawBridge) mainUpView.getEffectBridge();
        bridget.setTranDurAnimTime(100);

        h_LinearLayout.getViewTreeObserver().addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
            @Override
            public void onGlobalFocusChanged(View oldFocus, View newFocus) {
                final OpenEffectBridge bridge = (OpenEffectBridge) mainUpView.getEffectBridge();
                    newFocus.bringToFront();
                    mSavebridge = bridge;
                    // 动画结束才设置边框显示,
                    // 是位了防止翻页从另一边跑出来的问题.
                    bridge.setOnAnimatorListener(new OpenEffectBridge.NewAnimatorListener() {
                        @Override
                        public void onAnimationStart(OpenEffectBridge bridge, View view, Animator animation) {
                        }

                        @Override
                        public void onAnimationEnd(OpenEffectBridge bridge1, View view, Animator animation) {
                            if (mSavebridge == bridge1)
                                bridge.setVisibleWidget(false);
                        }
                    });
                    mainUpView.setFocusView(newFocus, oldFocus, scale);
                }
        });

    }


    /**
     * 动画 放大/缩小
     *
     * @param view
     * @param hasFocus
     */
    public static void scaleView(View view, boolean hasFocus) {
        float scale = hasFocus ? 1.2f : 1.0f;
        view.animate().scaleX(scale).scaleY(scale).setInterpolator(new AccelerateInterpolator()).setDuration(100);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
            v.bringToFront();
//            h_scrollView.smoothScrollBy(jxSmoothScrollBy(v), 0);
//            System.out.println("jxSmoothScrollBy_" + jxSmoothScrollBy(v));
        }
        scaleView(v, hasFocus);
    }

    private int jxSmoothScrollBy(View view){
        int msa = h_scrollView.getScrollX();
        int x = 0;
        int widthG = ScreenUtil.getScreenWidth(this) / 2;
        int viewW1 = (int)view.getX();
        int viewW2 = viewW1 + view.getWidth();
        int widthC = viewW2 - (view.getWidth() / 2);


        if(widthC >= widthG){
            x =  widthC - widthG;
        }else{
            x =  widthG - widthC;
        }
        return x;
    }
}

3,使用RecyclerViewGridLayout
这里横向滑动多条记录

package cn.gs.m2m.aaaaa;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

/*
 * Main Activity class that loads {@link MainFragment}.
 */
public class Main3Activity extends Activity {


    RecyclerView recyclerView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        recyclerView = findViewById(R.id.recyclerView);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 5);
        recyclerView.setLayoutManager(gridLayoutManager);


        List<String> stringList = new ArrayList<>();
        stringList.add("1111");
        stringList.add("2222");
        stringList.add("3333");
        stringList.add("4444");
        stringList.add("5555");
        stringList.add("6666");
        stringList.add("7777");
        stringList.add("1111");
        stringList.add("2222");
        stringList.add("3333");
        stringList.add("4444");
        stringList.add("5555");
        stringList.add("6666");
        stringList.add("7777");
        stringList.add("1111");
        stringList.add("2222");
        stringList.add("3333");
        stringList.add("4444");
        stringList.add("5555");
        stringList.add("6666");
        stringList.add("7777");
        stringList.add("1111");
        stringList.add("2222");
        stringList.add("3333");
        stringList.add("4444");
        stringList.add("5555");
        stringList.add("6666");
        stringList.add("7777");


        A3dapter a3dapter = new A3dapter(this, stringList);

        recyclerView.setAdapter(a3dapter);

    }
}

个人建议使用HorizontalScrollView更实用
第一种方法是谷歌推荐使用的HorizontalGridView,可以直接在studio上创建一个TV demo就有源码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又双㕛叕、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值