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就有源码。