12. 视频模块(三)之视频详情2

本文详细介绍了视频模块中的视频详情部分,包括视频清晰度菜单的逻辑代码实现,以及‘视频详情’界面的展示逻辑,如视频播放、简介、目录列表的交互。在清晰度菜单部分,阐述了横屏播放时切换高清和清晰的处理方法。而在‘视频详情’界面,讲解了如何获取和展示视频简介及目录,以及视频播放的实现,包括调用第三方播放器和处理横屏全屏播放。

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

上一节对欢迎模块进行了综述(可参见 8. 统计模块 进行了解),接下来将从视频模块开始详细介绍:

知识点

  • 显示视频简介、视频目录、视频播放等信息
  • 使用第三方CC视频播放器播放

视频详情2

16. 视频清晰度菜单逻辑代码

任务分析:
当横屏播放视频时,点击屏幕右下角的“清晰度”按钮会弹出“显示高清和清晰”两个选项的菜单,点击“高清”或“清晰”选项界面会加载对应的视频清晰度。

任务实施:
(1)创建PopMenu类。在view包中创建一个PopMenu类并实现OnItemClickListener接口。

PopMenu.java

/**
 * 弹出菜单
 */
public class PopMenu implements AdapterView.OnItemClickListener {
    public interface OnItemClickListener {
        public void onItemClick(int position);
    }
    private ArrayList<String> itemList;
    private Context context;
    private PopupWindow popupWindow;
    private ListView listView;
    private OnItemClickListener listener;
    private int checkedPosition;
    public PopMenu(Context context, int resid, int checkedPosition, int height) {
        this.context = context;
        this.checkedPosition = checkedPosition;
        itemList = new ArrayList<String>();
        RelativeLayout view = new RelativeLayout(context);
        listView = new ListView(context);
        listView.setPadding(0, ParamsUtils.dpToPx(context, 3), 0, ParamsUtils.
                dpToPx(context, 3));
        view.addView(listView, new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.
                WRAP_CONTENT));
        listView.setAdapter(new PopAdapter());
        listView.setOnItemClickListener(this);
        popupWindow = new PopupWindow(view, context.getResources().getDimensionPixelSize(
                R.dimen.popmenu_width), height);
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.argb(178, 0, 0, 0)));
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        if (listener != null) {
            listener.onItemClick(position);
            checkedPosition = position;
            listView.invalidate();
        }
        dismiss();
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
    public void addItems(String[] items) {
        for (String s : items)
            itemList.add(s);
    }
    public void addItem(String item) {
        itemList.add(item);
    }
    public void showAsDropDown(View parent) {
        popupWindow.showAsDropDown(parent, parent.getWidth() / 2 * -1,
                context.getResources().getDimensionPixelSize(R.dimen.popmenu_yoff));
        popupWindow.setFocusable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.update();
    }
    public void dismiss() {
        popupWindow.dismiss();
    }
    private final class PopAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return itemList.size();
        }
        @Override
        public Object getItem(int position) {
            return itemList.get(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            RelativeLayout layoutView = new RelativeLayout(context);
            TextView textView = new TextView(context);
            textView.setTextSize(13);
            textView.setText(itemList.get(position));
            textView.setTag(position);
            if (checkedPosition == position || itemList.size() == 1) {
                textView.setTextColor(context.getResources().getColor(R.color.
                        rb_text_check));
            } else {
                textView.setTextColor(Color.WHITE);
            }
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            layoutView.addView(textView, params);
            layoutView.setMinimumHeight(ParamsUtils.dpToPx(context, 26));
            return layoutView;
        }
    }
}

(2)修改dimens.xml文件。PopMenu.java文件中需要设置PopMenu菜单的宽度与高度。

    <dimen name="popmenu_width">100dp</dimen>
    <dimen name="popmenu_yoff">5dp</dimen>

17.“视频详情”界面逻辑代码

任务分析:
“视频详情”界面主要展示视频播放、视频简介以及视频目录列表,当点击“视频简介”按钮时,将展示视频简介的布局;当点击“视频目录列表”按钮时,将展示视频目录列表布局。视频简介与视频目录列表的数据是从“视频列表”界面传递过来的,当用户点击视频目录中的任意一条时,“视频详情”界面上方都会加载播放对应的视频,同时点击正在播放的视频右下角的“全屏”按钮会横屏全屏播放视频。该界面的视频播放是调用第三方CC视频播放器播放的。

任务实施:
(1)获取界面控件。在VideoDetailActivity中创建界面控件的初始化方法initViewPager(),用于获取“视频简介”与“视频目录”界面所要用到的控件。

(2)创建视频播放的方法。在VideoDetailActivity中创建一个VideoPaly()方法,在该方法中调用setVideoPlayInfo()方法,并以传递的视频Id以及从CC平台上获取的USERID与API_KEY为参数实现视频播放。

VideoDetailActivity.java

/**
 * 视频播放界面
 */
public class VideoDetailActivity extends Activity implements
        DWMediaPlayer.OnBufferingUpdateListener,
        DWMediaPlayer.OnInfoListener,
        DWMediaPlayer.OnPreparedListener, DWMediaPlayer.OnErrorListener,
        MediaPlayer.OnVideoSizeChangedListener, SurfaceHolder.Callback, SensorEventListener, OnCompletionListener {
    private boolean networkConnected = true;
    private DWMediaPlayer player;
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private ProgressBar bufferProgressBar;
    private SeekBar skbProgress;
    private ImageView backPlayList, ivFullscreen;
    private TextView videoIdText, playDuration, videoDuration, tvDefinition, tv_intro;
    private PopMenu definitionMenu;
    private LinearLayout playerTopLayout, volumeLayout, playerBottomLayout, llBelow;
    private AudioManager audioManager;
    private VerticalSeekBar volumeSeekBar;
    private int currentVolume, maxVolume;
    private boolean isPrepared;
    private Map<String, Integer> definitionMap;
    private Handler playerHandler;
    private Timer timer = new Timer();
    private TimerTask timerTask, networkInfoTimerTask;
    private int currentScreenSizeFlag = 1;
    private int currentDefinitionIndex = 0;
    // 默认设置为普清
    private int defaultDefinition = DWMediaPlayer.NORMAL_DEFINITION;
    private Boolean isPlaying;
    // 当player未准备好,并且当前activity经过onPause()生命周期时,此值为true
    private boolean isFreeze = false;
    private int currentPosition, currentPlayPosition;
    private String[] definitionArray;
    private final String[] screenSizeArray = new String[]{"满屏", "100%", "75%", "50%"};
    private TopLineApplication application;
    private GestureDetector detector;
    private float scrollTotalDistance;
    private RelativeLayout rlPlay;
    private WindowManager wm;
    public final static String API_KEY = "ERNcidRowobGEtL4u3i3zx7s6YS9sk1W"; // 配置API KEY
    public final static String USERID = "ED9742DB71BAEFEF";                    // 配置帐户ID
    private TabLayout mTabLayout;
    private ViewPager mViewPager;
    private LayoutInflater mInflater;
    private List<String> mTitleList = new ArrayList<>(); //页卡标题集合
    private View view1, view2;                           //页卡视图
    private List<View> mViewList = new ArrayList<>();   //页卡视图集合
    private String intro, videoDetailName, videoId;
    private ListView lv_list;
    private List<VideoDetailBean> videoList;
    private VideoDetailListAdapter videoDetailListAdapter;
    // 隐藏界面的线程
    private Runnable hidePlayRunnable = new Runnable() {
        @Override
        public void run() {
            setLayoutVisibility(View.GONE, false);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 隐藏标题
        application = (TopLineApplication) getApplication();
        application.getDRMServer().reset();
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_video_detail);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        detector = new GestureDetector(this, new MyGesture());
        intro = getIntent().getStringExtra("intro");
        videoList = (List<VideoDetailBean>) getIntent().getSerializableExtra("videoDetailList");
        if (videoList != null) {
            videoId = videoList.get(0).getVideo_id();//刚进此界面时首先播放的是列表中的第一个视频
            videoDetailName = videoList.get(0).getVideo_name();
        }
        initView();
        initViewPager();
        initPlayHander();
        initPlayInfo();
        initNetworkTimerTask();
    }
    private void initNetworkTimerTask() {
        networkInfoTimerTask = new TimerTask() {
            @O
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值