android 仿EF看视频弹出练习功能
第一次看到英孚iPad上的视频练习,感觉好有创意,让我们学习英语起来更加的有激情。而且不仅仅是在EF上有。相信在其它的学校肯定也会有的。
以上也我尝试把它写出来的原因了。
以下让我们来看看它的效果是怎么样子的?
它是怎么实现的呢?
首先我们看下布局文件的内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.adthvideo.ui.MainActivity$PlaceholderFragment" > <RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="3dp"
android:layout_weight="6" > <TextView
android:id="@+id/tv_class_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="课题:印象泰国" /> <FrameLayout
android:id="@+id/fl_frame"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_below="@id/tv_class_title" > <SurfaceView
android:id="@+id/mySurfaceView"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_below="@id/tv_class_title" /> <LinearLayout
android:id="@+id/ll_pretreatment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical" > <ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="正在解析視頻..." />
</LinearLayout>
</FrameLayout> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/fl_frame"
android:background="@drawable/test_widget_bg" > <Button
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="3dp"
android:background="@drawable/player_pause_highlight" /> <TextView
android:id="@+id/play_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/play"
android:textColor="#ffffff"
android:textSize="12sp" /> <SeekBar
android:id="@+id/seekBar"
style="@style/player_progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_toLeftOf="@+id/play_end_time"
android:layout_toRightOf="@+id/play_time" /> <TextView
android:id="@+id/play_end_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="3dp"
android:textColor="#ffffff"
android:textSize="12sp" />
</RelativeLayout>
</RelativeLayout> <RelativeLayout
android:id="@+id/rl_answer"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="3dp"
android:layout_weight="4"
android:visibility="gone" > <TextView
android:id="@+id/tv_title_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp" /> <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title_list"
android:layout_marginTop="5dp" /> <Button
android:id="@+id/btn_answer1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title"
android:layout_marginTop="3dp"
android:background="#C0C0C0"
android:visibility="invisible" /> <Button
android:id="@+id/btn_answer2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn_answer1"
android:layout_marginTop="3dp"
android:background="#C0C0C0"
android:visibility="invisible" /> <Button
android:id="@+id/btn_answer3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn_answer2"
android:layout_marginTop="3dp"
android:background="#C0C0C0"
android:visibility="invisible" /> <Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="20dp"
android:layout_marginRight="20dp"
android:text="下一题" />
</RelativeLayout> </LinearLayout>
当然有练习题目。这里就创建了一个Practice对象。内容例如以下:
package com.adthvideo.bean;
public class Practice {
private String title_list;
private String title;
private String issue_1;
private String issue_2;
private String issue_3;
private String time;
private boolean flag;
public Practice(String time, String title_list, String title, String issue_1,
String issue_2, String issue_3) {
super();
this.time = time;
this.title_list = title_list;
this.title = title;
this.issue_1 = issue_1;
this.issue_2 = issue_2;
this.issue_3 = issue_3;
this.flag = false;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getTitle_list() {
return title_list;
}
public void setTitle_list(String title_list) {
this.title_list = title_list;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getIssue_1() {
return issue_1;
}
public void setIssue_1(String issue_1) {
this.issue_1 = issue_1;
}
public String getIssue_2() {
return issue_2;
}
public void setIssue_2(String issue_2) {
this.issue_2 = issue_2;
}
public String getIssue_3() {
return issue_3;
}
public void setIssue_3(String issue_3) {
this.issue_3 = issue_3;
}
public boolean getFlag() {
return flag;
}
public void setFlag(boolean _flag) {
flag = _flag;
}
}
最后另一个activity是这种:
package com.adthvideo.ui; import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import com.adthvideo.bean.Practice;
import com.adthvideo.utils.TabletUtil;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.SurfaceHolder.Callback;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener; public class MainActivity extends Activity implements OnClickListener{ private SurfaceView mSurfaceView = null;
private MediaPlayer mMediaPlayer = null;
private Handler handler;
Thread thread;
private TextView play_time;
private TextView play_end_time;
private SeekBar mSeekBar;
/**
* 当前位置
*/
private int currentPosition = 0;
private boolean flag;
private Button play;
private TextView tv_title_list;
private TextView tv_title;
private Button btn_submit;
private Button btn_answer1;
private Button btn_answer2;
private Button btn_answer3;
private List<Practice> list;
private RelativeLayout rl_answer;
private LinearLayout ll_pretreatment;
@SuppressWarnings("deprecation")
@SuppressLint("HandlerLeak")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
boolean isTablet = TabletUtil.isTablet(this);
if(isTablet){
setContentView(R.layout.fragment_main);
Exitlication.getInstance().addActivity(MainActivity.this);
play_time = (TextView) findViewById(R.id.play_time);
play_end_time = (TextView) findViewById(R.id.play_end_time);
play = (Button) findViewById(R.id.play);
play.setOnClickListener(this);
rl_answer = (RelativeLayout) findViewById(R.id.rl_answer);
ll_pretreatment = (LinearLayout) findViewById(R.id.ll_pretreatment);
btn_submit = (Button) findViewById(R.id.btn_submit);
tv_title_list = (TextView) findViewById(R.id.tv_title_list);
tv_title = (TextView) findViewById(R.id.tv_title);
btn_answer1 = (Button) findViewById(R.id.btn_answer1);
btn_answer2 = (Button) findViewById(R.id.btn_answer2);
btn_answer3 = (Button) findViewById(R.id.btn_answer3);
btn_submit.setOnClickListener(this);
btn_answer1.setOnClickListener(this);
btn_answer2.setOnClickListener(this);
btn_answer3.setOnClickListener(this);
handler=new Handler(){
public void handleMessage(Message msg){
switch (msg.what){
case 0:
int a=msg.getData().getInt("1");
int b=msg.getData().getInt("2");
set(b,a);
// System.out.println("time:"+time+"\n");//time:0:01
break;
case 1:
String title = msg.getData().getString("title");
String issue_1 = msg.getData().getString("issue_1");
String issue_2 = msg.getData().getString("issue_2");
String issue_3 = msg.getData().getString("issue_3");
String title_list = msg.getData().getString("title_list");
MainActivity.this.btn_answer1.setText(issue_1);
btn_answer1.setVisibility(View.VISIBLE);
btn_answer2.setVisibility(View.VISIBLE);
btn_answer3.setVisibility(View.VISIBLE);
btn_answer1.setClickable(true);
btn_answer2.setClickable(true);
btn_answer3.setClickable(true);
btn_answer1.setSelected(false);
btn_answer2.setSelected(false);
btn_answer3.setSelected(false);
btn_answer1.setBackgroundColor(Color.rgb(192, 192, 192));
btn_answer2.setBackgroundColor(Color.rgb(192, 192, 192));
btn_answer3.setBackgroundColor(Color.rgb(192, 192, 192));
MainActivity.this.btn_answer2.setText(issue_2);
MainActivity.this.btn_answer3.setText(issue_3);
MainActivity.this.tv_title_list.setText(title_list);
MainActivity.this.tv_title.setText(title);
play.setBackgroundResource(R.drawable.player_play_highlight);
rl_answer.setVisibility(View.VISIBLE);
break;
}
}
private void set(int progress, int max) {
// tv_time.setText(toTime(progress) + "/"
// + toTime(max));
play_time.setText(toTime(progress));
play_end_time.setText(toTime(max));
}
};
mSeekBar = (SeekBar) findViewById(R.id.seekBar);
mSeekBar.setEnabled(false);
mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (mMediaPlayer != null) {
int progress = seekBar.getProgress();
mMediaPlayer.seekTo(progress);
}
} @Override
public void onStartTrackingTouch(SeekBar seekBar) { } @Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) { }
}); mSurfaceView = (SurfaceView) findViewById(R.id.mySurfaceView);
mSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mSurfaceView.getHolder().addCallback(new Callback() { @Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed");
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
currentPosition = mMediaPlayer.getCurrentPosition();
}
stop();
} @Override
public void surfaceCreated(SurfaceHolder holder) {
System.out.println("surfaceCreated");
if(currentPosition==0){
play(0);
}else if (currentPosition > 0) {
play(currentPosition);
}
} @Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
System.out.println("surfaceChanged"); }
}); list = new ArrayList<Practice>();
Practice mPractice1 = new Practice("0:10","问题1/3"
,"1、You can play ________ the clean dog after class.","A.with","B.in","C.at");
Practice mPractice2 = new Practice("0:30","问题2/3"
,"2、They are reading about an English boy ________ the newspaper."
,"A.on","B.at","C.in");
Practice mPractice3 = new Practice("1:30","问题3/3"
,"3、Can I have ________ postcards? "
,"A.any","B.a","C.some");
list.add(mPractice1);
list.add(mPractice2);
list.add(mPractice3);
}else{
setContentView(R.layout.fragment_miniphone_main);
}
} private String toTime(int progress) {
StringBuffer sb = new StringBuffer();
int s = (progress / 1000) % 60;
int m = progress / 60000;
sb.append(m).append(":");
if (s < 10) {
sb.append(0);
}
sb.append((progress / 1000) % 60);
return sb.toString();
}
@SuppressLint("ShowToast")
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int v_id = v.getId();
switch (v_id) {
case R.id.play:
pause();
break;
case R.id.btn_submit:
//提交:
boolean isplayflag = false;
if(this.btn_answer1.isSelected()){
Toast.makeText(MainActivity.this, "您点中了"+this.btn_answer1.getText(), Toast.LENGTH_LONG).show();
isplayflag = true;
}
else if(this.btn_answer2.isSelected()){
Toast.makeText(MainActivity.this, "您点中了"+this.btn_answer2.getText(), Toast.LENGTH_LONG).show();
isplayflag = true;
}
else if(this.btn_answer3.isSelected()){
Toast.makeText(MainActivity.this, "您点中了"+this.btn_answer3.getText(), Toast.LENGTH_LONG).show();
isplayflag = true;
}else{
isplayflag = false;
Toast.makeText(MainActivity.this, "请回答问题,才干进入下一个题目! ", Toast.LENGTH_LONG).show();
}
if(isplayflag){
mMediaPlayer.start();
rl_answer.setVisibility(View.GONE);
play.setBackgroundResource(R.drawable.player_pause_highlight);
play.setClickable(true);
flag = true;
}
break;
case R.id.btn_answer1:
this.btn_answer1.setBackgroundColor(Color.GRAY);
this.btn_answer1.setSelected(true);
this.btn_answer2.setClickable(false);
this.btn_answer3.setClickable(false);
break;
case R.id.btn_answer2:
this.btn_answer2.setBackgroundColor(Color.GRAY);
this.btn_answer1.setClickable(false);
this.btn_answer2.setSelected(true);
this.btn_answer3.setClickable(false);
break;
case R.id.btn_answer3:
this.btn_answer3.setBackgroundColor(Color.GRAY);
this.btn_answer2.setClickable(false);
this.btn_answer3.setSelected(true);
this.btn_answer1.setClickable(false);
break;
default:
break;
}
} @SuppressLint("ShowToast")
private void stop() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
} @SuppressLint("ShowToast")
private void pause() {
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
play.setBackgroundResource(R.drawable.player_play_highlight);
// mSeekBar.setEnabled(false);
}
else {
mMediaPlayer.start();
play.setBackgroundResource(R.drawable.player_pause_highlight);
// mSeekBar.setEnabled(true);
}
} @SuppressLint("ShowToast")
private void play(final int currentPosition2) {
try {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDisplay(mSurfaceView.getHolder());
mMediaPlayer.setDataSource("http://www.fantasticthaitaste.com/streams/thaifood.mp4");
mMediaPlayer.prepareAsync();
// mSeekBar.setEnabled(true);
mMediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
final int max = mMediaPlayer.getDuration();
ll_pretreatment.setVisibility(View.GONE);
mSeekBar.setMax(max);
mMediaPlayer.seekTo(currentPosition2);
thread = new Thread() {
public void run() {
flag = true;
while (flag) {
try {
if(mMediaPlayer==null){
return;
}
int progress = mMediaPlayer.getCurrentPosition();
mSeekBar.setProgress(progress);
Message message = new Message();
Bundle bundle=new Bundle();
message.setData(bundle);
bundle.putInt("1", max);
bundle.putInt("2", progress);
message.what = 0;
handler.sendMessage(message); for(int i = 0; i<list.size(); i++){
Practice p = list.get(i);
String time = p.getTime();
String title_list = p.getTitle_list();
String title = p.getTitle();
String issue_1 = p.getIssue_1();
String issue_2 = p.getIssue_2();
String issue_3 = p.getIssue_3(); boolean timeMark = toTime(progress).equals(time);
if(timeMark&&p.getFlag()==false){
if(mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
Message msg1 = new Message();
Bundle mBundle = new Bundle();
msg1.setData(mBundle);
mBundle.putString("title_list", title_list);
mBundle.putString("title", title);
mBundle.putString("issue_1", issue_1);
mBundle.putString("issue_2", issue_2);
mBundle.putString("issue_3", issue_3);
msg1.what = 1;
handler.sendMessage(msg1);
}
play.setClickable(false);
p.setFlag(true);
}
}
// System.out.println("time:"+time+",porgress:"+progress+"\n");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
};
thread.start();
}
});
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// bt_play.setEnabled(true);
}
});
mMediaPlayer.setOnErrorListener(new OnErrorListener() { @Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//bt_play.setEnabled(true);
flag = false;
return false;
}
});
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "播放失败", 1).show();
}
} /**
* 菜单、返回键响应
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
exitBy2Click(); //调用双击退出函数
}
return false;
}
/**
* 双击退出函数
*/
private static Boolean isExit = false; private void exitBy2Click() {
Timer tExit = null;
if (isExit == false) {
isExit = true; // 准备退出
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
tExit = new Timer();
tExit.schedule(new TimerTask() {
@Override
public void run() {
isExit = false; // 取消退出
}
}, 2000); // 假设2秒钟内没有按下返回键,则启动定时器取消掉刚才运行的任务
} else {
Exitlication.getInstance().exit();
}
} }
以上的内容是就能够实现啦。
源代码下载例如以下:
http://download.csdn.net/detail/hehaiminginadth/8903029
android 仿EF看视频弹出练习功能的更多相关文章
- 转:仿QQ长按弹出功能菜单
android app普遍常用的弹出上下文菜单是列表式的.QQ列表,在上方弹出冒泡效果菜单,如图 这里讲解一下如何写出这个效果: 图片资源:两张图片,可以拼接成如上效果. 首先,我们需要写布局文件: ...
- Android 仿微信小视频录制
Android 仿微信小视频录制 WechatShortVideo和WechatShortVideo文章
- Android ListView 长按列表弹出菜单
Android ListView 长按列表弹出菜单 设置长按菜单 listView.setOnCreateContextMenuListener(new View.OnCreateContextMen ...
- JavaScript动态实现div窗口弹出&消失功能
先积累一个JavaScript动态实现div窗口弹出&消失功能 首先是index.jsp代码 <html> <head> <link rel="styl ...
- 【Android】百度地图自定义弹出窗口
我们使用百度地图的时候,点击地图上的Marker,会弹出一个该地点详细信息的窗口,如下左图所示,有时候,我们希望自己定义这个弹出窗口的内容,或者,干脆用自己的数据来构造这样的弹出窗口,但是,在百度地图 ...
- Android点击列表后弹出输入框,所点击项自动滚动到输入框上方
使用微信的朋友圈会发现,点击某一条评论后输入框会弹出来,然后所点击的那一项会自动地滚动到输入框上方的位置,这样如果开始所点击的评论在屏幕很下方的话,就不会被输入框遮住,虽然微信这一点在我的MX2频繁点 ...
- Android PopupWindow怎么合理控制弹出位置(showAtLocation)
说到PopupWindow,应该都会有种熟悉的感觉,使用起来也很简单 // 一个自定义的布局,作为显示的内容 Context context = null; // 真实环境中要赋值 int layou ...
- android穿越之旅--如何弹出一个非比寻常的窗体
上一篇中介绍了一种闻所未闻在android执行java命令的方法,虽然这是一种非常"高级"的技术,然后并没有什么卵用,因此被移除了博客园首页.实际上也并不是一点用处也没有,对已立即 ...
- android PopupWindow实现从底部弹出或滑出选择菜单或窗口
本实例弹出窗口主要是继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计.弹出效果主要使用了translate和alpha样式实现,具体实习如下: 第一步:设计弹出窗口xml: &l ...
随机推荐
- 顶部图片放大回弹效果Scrollview ---- 各应用中常见的自定义View 解析
原理并不难. 代码量也不大. 非常简洁 . 先来个效果图 再上一波代码. public class SpecialScrollView extends ScrollView implements ...
- tomcat - 部署Web应用
概述 以前,安装李刚的JavaEE里面说的方法部署应用的时候,无意中成功,但是后来每次要录视频的时候,又报错,思来想去,tomcat都重启了好多次了,配置文件也试过很多次了,还是不行.无意中发现了问题 ...
- 写一个基于NSURLSession的网络下载库
前段时间AFNetworking 更新到3.0 ,彻底废弃NSURLConnection的API转由NSURLSession来实现,代码并没有改动很大,AF封装的很好了,读完源码感觉收获很大. 下载不 ...
- iOS 中Window优先级的问题
在项目中,视频播放时候遇到网络切换需要弹出AlertView提醒用户,忽然发现转屏的时候播放View加到KeyWindow的时候把AleryView挡住了.如图 因为转屏的时候视图是直接加载到 [UI ...
- ASP.NET菜鸟之路之实现新闻列表增删改
背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. 网站介绍 根据视频的例子修改的方法,其中数据不经 ...
- 重温web服务器--细说Tomcat服务器
从大学开始接触java web的开发时就开始使用tomcat部署web项目,对它的理解仅仅停留在"这是个开源免费的servlet容器"的阶段,后来也接触了一些tomcat的体系,原 ...
- 【USACO 1.3.4】牛式
[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ------- ...
- C++ Primer 5th 第12章 动态内存
练习12.1:在此代码的结尾,b1 和 b2 各包含多少个元素? StrBlob b1; { StrBlob b2 = {"a", "an", "th ...
- Nginx源码研究四:NGINX的内存管理
关于nginx的内存使用,我们先看代码,下面是nginx_cycle.c中对全局数据结构cycle的初始化过程 pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, ...
- 优雅降级&渐进增强
优雅降级(Graceful Degradation) 关注点:最新的浏览器上构建体验很好的WEB应用. 降级:旧版本浏览器提供差强人意的体验,不影响功能的使用. 渐进增强(Progressive En ...