基于jiecaovideo实现类似腾讯新闻视频item不可见小屏播放,item可见时小屏切换到itemy

先上个效果图,基于开源项目jiecaovideo修改,类似于腾讯新闻效果

此特效View为JCVideoPlayerListAutoWindowTiny继承自JCVideoPlayerStandard

Item滑出屏幕后自动小屏播放,Item再次滑入屏幕,则小屏切回Item播放


用法示例

使用JCVideoPlayerListAutoWindowTiny的调用代码

 Object[] youData = {"标题", position + ""};
 jCVideoPlayerListAutoWindowTiny.setUp( "url", JCVideoPlayer.SCREEN_LAYOUT_LIST,youData);

在你使用JCVideoPlayerListAutoWindowTiny的Activity中,其实就是把JCVideoPlayer更换为JCVideoPlayerListAutoWindowTiny
 @Override
    public void onBackPressed() {
        if (JCVideoPlayerListAutoWindowTiny.backPress()) {
            return;
        }
        super.onBackPressed();
    }

源码部分

package fm.jiecao.jcvideoplayer_lib;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by yujunkui
 * On 2016/08/30
 */
public class JCVideoPlayerListAutoWindowTiny extends JCVideoPlayerStandard {


    public String position="-1";//记录播放的position

    public JCVideoPlayerListAutoWindowTiny(Context context) {
        super(context);
    }

    public JCVideoPlayerListAutoWindowTiny(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void init(Context context) {
        super.init(context);
    }

    @Override
    public   boolean setUp(String url, int screen, Object... objects) {
        Log.i(TAG, "setUp [" + this.hashCode() + "]isCurrentMediaListener()=" + isCurrentMediaListener() + " this.currentState == CURRENT_STATE_PLAYING=" + (this.currentState == CURRENT_STATE_PLAYING) + " screen!=SCREEN_WINDOW_FULLSCREEN" + (screen != SCREEN_WINDOW_FULLSCREEN));
        JCVideoPlayerListAutoWindowTiny jcVideoPlayer = null;
        boolean isPlayingTiny=false;//当前是否在播放
        if (JCVideoPlayerManager.listener() != null) {
            jcVideoPlayer = (JCVideoPlayerListAutoWindowTiny) JCVideoPlayerManager.listener();
            isPlayingTiny=jcVideoPlayer.currentScreen==SCREEN_WINDOW_TINY?true:false;
//            Log.i(TAG, "setUp [" + this.hashCode() + "] jcVideoPlayer.objects[1]="+jcVideoPlayer.objects[1]);
        }
        if (isCurrentMediaListener() //当前播放监听是否是自己
                && this.currentState == CURRENT_STATE_PLAYING //正在播放
                && screen != SCREEN_WINDOW_FULLSCREEN //是否在全屏
                && !isFullSwitchList//是否全屏切到listview
                &&!isPlayingTiny) {//在播放
            //启动小屏
            startWindowTiny();
        } else if (jcVideoPlayer != null
                && objects.length>1
//                && jcVideoPlayer.objects[1] != null && objects[1] != null
                && position.equals(objects[1])//position是否一致
                && jcVideoPlayer.currentState == CURRENT_STATE_PLAYING//是否在播放
                && jcVideoPlayer.currentScreen == SCREEN_WINDOW_TINY) {//是否小屏
            Log.i(TAG, "setUp Tiny To List [" + this.hashCode() + "] position="+position+" objects[1]="+objects[1]);
            JCVideoPlayerManager.listener().goToOtherListener();//返回到item播放
        } else {
            isFullSwitchList = false;
        }
        boolean superReturn = super.setUp(url, screen, objects);
        if (currentScreen == SCREEN_WINDOW_TINY) {
            tinyBackImageView.setVisibility(View.INVISIBLE);//设置在小屏下隐藏back
        }
        return superReturn;
    }

    public boolean isFullSwitchList = false;//是否从全屏切换到小屏

    @Override
    public void onClick(View v) {
        super.onClick(v);
        int i = v.getId();
        if (i == R.id.surface_container && currentScreen == SCREEN_WINDOW_TINY) {
            //回调小屏下小屏被点击事件
            Toast.makeText(getContext(),"小屏被点击",Toast.LENGTH_SHORT).show();
        } else if (i == R.id.fullscreen) {
            if (currentScreen != SCREEN_WINDOW_FULLSCREEN) {
                isFullSwitchList = true;//全屏时候做个标识  以便在setup的时候不会切换成小屏
            }
        }else if (i == R.id.thumb||i==R.id.start) {
            position=objects[1].toString();
        }
    }

    public static boolean backPress() {//这个方法如果你没看过源码 基本可能看不懂
        Log.i(TAG, "backPress");
        if (JCVideoPlayerManager.listener() != null) {
            JCVideoPlayerListAutoWindowTiny jcVideoPlayer = (JCVideoPlayerListAutoWindowTiny) JCVideoPlayerManager.listener();
            if (jcVideoPlayer.currentScreen != SCREEN_WINDOW_TINY) {
                if (jcVideoPlayer.currentScreen == SCREEN_WINDOW_FULLSCREEN) {//如果当前是全屏则在切换完后对小屏的isFullSwitchList进行操作
                    boolean b = JCVideoPlayerManager.listener().goToOtherListener();
                    JCVideoPlayerListAutoWindowTiny currentJcVideoPlayer = (JCVideoPlayerListAutoWindowTiny) JCVideoPlayerManager.listener();
                    currentJcVideoPlayer.isFullSwitchList = true;//back标识
                    return b;
                }
                return JCVideoPlayerManager.listener().goToOtherListener();
            }
        }
        return false;
    }

}

放到自己项目直接用即可。注释应该可以看明白

注:这个实现没有详细测试。仅作为参考或者实现思路使用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在安卓的RecycleView中,当添加数据时,RecycleView的大小是根据所有item的大小自动计算的。具体过程如下: 1. 在Adapter中的onCreateViewHolder方法中创建ViewHolder,并且设置每个item的布局和样式。 2. 在Adapter中的onBindViewHolder方法中绑定ViewHolder和数据,并且设置每个item的大小和位置。这里可以根据不同的数据动态计算每个item的大小和位置。 3. 在RecycleView的LayoutManager中计算所有item的大小和位置,并且根据这些信息自动计算RecycleView的大小。LayoutManager会根据不同的布局方式(例如线性布局、网格布局等)来计算每个item的大小和位置。 4. 当添加新的数据时,RecycleView会重新计算所有item的大小和位置,并且自动调整RecycleView的大小。 具体的代码过程如下: ```java // 在Adapter中的onCreateViewHolder方法中创建ViewHolder @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } // 在Adapter中的onBindViewHolder方法中绑定ViewHolder和数据,并且设置每个item的大小和位置 @Override public void onBindViewHolder(ViewHolder holder, int position) { // 绑定数据 holder.bindData(dataList.get(position)); // 设置item的大小和位置 ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); layoutParams.width = itemWidth; layoutParams.height = itemHeight; holder.itemView.setLayoutParams(layoutParams); holder.itemView.setX(itemX); holder.itemView.setY(itemY); } // 在RecycleView的LayoutManager中计算所有item的大小和位置,并且根据这些信息自动计算RecycleView的大小 LayoutManager layoutManager = new LinearLayoutManager(context); recyclerView.setLayoutManager(layoutManager); // 当添加新的数据时,RecycleView会重新计算所有item的大小和位置,并且自动调整RecycleView的大小 adapter.notifyDataSetChanged(); ``` 这里的itemWidth、itemHeight、itemX、itemY等参数可以根据具体需求来设置,例如根据数据动态计算每个item的大小和位置,或者手动设置每个item的大小和位置。LayoutManager会根据这些参数来计算每个item的位置和大小,并且自动调整RecycleView的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值