上一节对欢迎模块进行了综述(可参见 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