google vr 入门之VrPanoramaView制作全景图列表,斗鱼Android开发二面被刷

本文介绍了如何在Android应用中使用VrPanoramaView创建全景图列表,并通过RecyclerView实现滚动展示。在适配器中处理不同类型的视图,同时添加滚动监听以在停止滑动时显示全景图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xmlns:tools=“http://schemas.android.com/tools”

android:id="@+id/activity_main"

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“com.qj.vrpanoramaviewlist.MainActivity”>

<android.support.v7.widget.RecyclerView

android:id="@+id/recycleview"

android:layout_width=“match_parent”

android:layout_height=“match_parent”/>

mRecyclerView = (RecyclerView) findViewById(R.id.recycleview);

//全景图控件初始化

vrPanoramaView = new VrPanoramaView(this);

vrPanoramaView.setStereoModeButtonEnabled(false);//眼镜模式按钮禁掉

vrPanoramaView.setFullscreenButtonEnabled(false); //全屏模式按钮禁掉

vrPanoramaView.setInfoButtonEnabled(false); //信息按钮禁掉

vrPanoramaView.setTouchTrackingEnabled(true); //开启手触模式

options = new VrPanoramaView.Options();

options.inputType = VrPanoramaView.Options.TYPE_MONO;

为RecycleView准备数据,设置适配器

//准备数据,这里模拟假数据

mDatas = new ArrayList();

for (int i = ‘A’; i < ‘M’; i++) {

mDatas.add(String.valueOf((char) i));

}

mSize = mDatas.size();

mRecyclerView.setLayoutManager(new LinearLayoutMana

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

ger(this));

mAdapter = new HomeAdapter();

mRecyclerView.setAdapter(mAdapter);

看看HomeAdapter的内容:

class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

if (viewType == PANORAMA_ITEM) {

return new VrPanoramaViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_panorama, parent, false));

} else {

return new FooterHolder(LayoutInflater.from(mContext).inflate(R.layout.item_footer, parent, false));

}

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

if (mSize - position > 2) {

VrPanoramaViewHolder h = (VrPanoramaViewHolder) holder;

h.tv.setText(mDatas.get(position));

h.iv.setBackgroundResource(plan[position]);

if (isFirstTime) {//首次进入要显示第一个item的全景

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), vr[0]);

vrPanoramaView.loadImageFromBitmap(bitmap, options);

h.iv.addView(vrPanoramaView);

currentPos = 0;

isFirstTime = false;

}

} else if (position == mSize - 1) {

FooterHolder h = (FooterHolder) holder;

h.tv.setText(“到底啦…”);

}

Log.e(TAG, "onBindViewHolder: " + position);

}

@Override

public int getItemCount() {

return mSize;

}

@Override

public int getItemViewType(int position) {

if (mSize - position > 2) {

return PANORAMA_ITEM;//全景图类型的item

} else {

return FOOTER_ITEM;//底部填充的两个item

}

}

class VrPanoramaViewHolder extends RecyclerView.ViewHolder {//全景图的Holder

FrameLayout iv;

TextView tv;

public VrPanoramaViewHolder(View view) {

super(view);

iv = (FrameLayout) view.findViewById(R.id.iv_content);

tv = (TextView) view.findViewById(R.id.content_name);

}

}

class FooterHolder extends RecyclerView.ViewHolder {//底部填充的Holder

TextView tv;

public FooterHolder(View view) {

super(view);

tv = (TextView) view.findViewById(R.id.footer_tv);

}

}

}

对RecycleView添加滚动监听:

public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();

int pos = lastVisibleItemPosition - 2;

if (RecyclerView.SCROLL_STATE_IDLE == newState) {//停止滑动

showPanorama(pos);

} else {

if (pos == currentPos || currentPos < 0)//目前正在显示不能移除

return;

ViewParent parent = vrPanoramaView.getParent();

if (parent != null) {//防止在滑动过程中发现被复用的全景图控件

ViewGroup viewGroup = (ViewGroup) parent;

viewGroup.removeView(vrPanoramaView);

currentPos = -1;//此处赋值表示全景图控件没有处在任何item的位置

}

}

super.onScrollStateChanged(recyclerView, newState);

}

这是RecycleView滚动监听回调的方法,在回调中我们得到屏幕中最后一个可见的item的postion,即lastVisibleItemPosition,我们关心的不是这个条目,而是它的上上一个条目,故而才有了int pos = lastVisibleItemPosition - 2;这句代码,pos才是我所关心的(默认一屏幕最少显示三个item最多显示4个item,当前屏幕中最后一个可见的item位于屏幕中第3个或者是第4个的位置,该位置的上上一个item位于屏幕的中间靠上区域内,这个区域的条目显示全景图,用户看着会比较舒服),当停止滑动后,显示全景图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值