1、界面分析
? ? ? ? 三個(gè)界面:主界面,視頻列表界面,視頻播放界面,如下圖所示:
?2、實(shí)現(xiàn)思路
? ? ? ? (1)主界面設(shè)計(jì)
???????????很簡(jiǎn)單,就一個(gè)背景和一個(gè)控件,然后為控件設(shè)置點(diǎn)擊事件,然后跳轉(zhuǎn)到視頻列表界面
? ?activity_main.xml界面
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="@drawable/action"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="進(jìn)入視頻列表"
android:textColor="@color/white"
android:textStyle="bold"
android:textSize="30sp"
android:layout_marginTop="50dp"
android:layout_gravity="center"
android:id="@+id/btlogin"/>
</LinearLayout>
?MainActivity.java類(lèi)
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView) findViewById(R.id.btlogin);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(MainActivity.this,MovieActivity.class);
startActivity(intent);
}
});
}
}
? ? ? ? ?(2)視頻列表界面
? ? ? ??每次跳轉(zhuǎn)都需要建立一個(gè)新的Activity,所以先建立一個(gè)MovieActivity,然后在對(duì)應(yīng)的xml文件設(shè)置列表,因?yàn)榇私缑嬗玫降目丶荝ecycleView,此控件屬于新增的控件,因此需要手動(dòng)添加依賴(lài)項(xiàng)。
? ? ? ? 在app/build.gradle文件中添加依賴(lài)項(xiàng),在閉包dependencies中添加如下語(yǔ)句
implementation 'com.android.support:recyclerview-v7:33.0.0'
? ? ? ? 注意添加的版本要和此文件中上面代碼中顯示的版本要一致,否則就會(huì)報(bào)紅,且項(xiàng)目也運(yùn)行不了。?
?activity_movie.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MovieActivity"
android:orientation="vertical"
android:background="@drawable/back">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="視頻列表"
android:textSize="30sp"
android:gravity="center"
android:textStyle="bold"
android:background="@color/black"
android:textColor="@color/white"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerview"/>
</LinearLayout>
? ? ? ? ?列表框架就如下所示,所以看圖就可以知道我們還需要對(duì)此界面列表中的每一行進(jìn)行具體的設(shè)計(jì)
? ? ? ? ?新建一個(gè)xml文件,名為movie_item_layout.ml,具體如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@drawable/image"
android:id="@+id/movievideo"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/moviename"
android:text="dianyinm"
android:textSize="25sp"
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"/>
</LinearLayout>
? ? ? ? 我自己在寫(xiě)的時(shí)候,犯了一個(gè)小錯(cuò)誤,就是在此界面我又添加了背景圖,然后就導(dǎo)致了列表里的照片無(wú)論怎么設(shè)計(jì),每一行的數(shù)據(jù)都顯示在此背景圖上,然后另一個(gè)數(shù)據(jù)會(huì)顯示在另一張圖上,就好像分頁(yè)一樣,及其不美觀,所以如果在?activity_movie.xml文件中設(shè)置了背景圖的話(huà),就不用在此xml文件下再次設(shè)置了,這個(gè)界面是上一個(gè)界面的子布局。
????????
? ? ? ? 界面設(shè)置完之后,我們分析以下,視頻列表界面有哪些屬性呢,有視頻名,視頻地址,因?yàn)榇舜卧O(shè)計(jì)使用的照片都是統(tǒng)一的,所以就不用寫(xiě)在屬性里了。
? ? ? ? 所以在這里建立實(shí)體類(lèi)Movie.java
public class Movie {
private String moviename;
private String movieuri;
public Movie(String moviename,String movieuri){
this.moviename=moviename;
this.movieuri=movieuri;
}
public String getMoviename(){
return moviename;
}
public String getMovieuri(){
return movieuri;
}
}
? ? ? ? 然后就是需要為RecyclerView自定義一個(gè)適配器,所以建立一個(gè)適配器類(lèi),代碼如下:
MovieAdapter.java
public class MovieAdapter extends RecyclerView.Adapter<MovieAdapter.ViewHolder> {
List<Movie> mymovieList;
public class ViewHolder extends RecyclerView.ViewHolder{
View movieview;
TextView moviename;
public ViewHolder(@NonNull View view){
super(view);
moviename=itemView.findViewById(R.id.moviename);
movieview=view;
}
}
//利用適配器的構(gòu)造函數(shù)傳入要展示的數(shù)據(jù)
public MovieAdapter(List<Movie> mymovieList){
this.mymovieList=mymovieList;
}
//創(chuàng)建實(shí)例,把每一行的布局加載進(jìn)來(lái),創(chuàng)建一個(gè)ViewHolder實(shí)例,將布局傳入到構(gòu)造函數(shù)中,最后將實(shí)例返回
public MovieAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_item_layout,parent,false);
final ViewHolder holder=new ViewHolder(view);
//單擊任意視頻跳轉(zhuǎn)到播放界面
holder.movieview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//獲取位置
int position=holder.getAdapterPosition();
Movie movie=mymovieList.get(position);
String mymoviename=movie.getMoviename();
String mymovievideo=movie.getMovieuri();
//獲取位置后跳轉(zhuǎn)
Intent intent=new Intent(view.getContext(),PlayActivity.class);
//然后根據(jù)位置傳遞信息
intent.putExtra("my",mymoviename);
intent.putExtra("movieurl",mymovievideo);
view.getContext().startActivity(intent);
}
});
return holder;
}
//對(duì)recyclerview中子項(xiàng)目進(jìn)行賦值,通過(guò)位置得到當(dāng)前的實(shí)例,然后電影名和視頻顯示在控件上
public void onBindViewHolder(@NonNull MovieAdapter.ViewHolder holder,int position){
Movie movie=mymovieList.get(position);
holder.moviename.setText(movie.getMoviename());
}
public int getItemCount(){
return mymovieList.size();
}
}
? ? ? ? MovieAdapter繼承RecyclerView.Adapter,并將泛型指定為MovieAdapter.ViewHolder,因?yàn)槔^承了RecyclerView.Adapter類(lèi),所以必須對(duì)onCreateViewHolder()、onBindViewHolder、getItemCount()這3個(gè)方法重寫(xiě)。
? ? ? ? 因?yàn)橐x取SD卡和訪問(wèn)網(wǎng)絡(luò)上的視頻資源,所以要在androidmanifest.xml文件中設(shè)置讀取權(quán)限,如下所示:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.INTERNET"/>
? ? ? ? 設(shè)置完之后可能還獲取不了權(quán)限,我當(dāng)時(shí)寫(xiě)的時(shí)候總是讀取不了數(shù)據(jù),然后查了資料,才終于弄出來(lái),應(yīng)該是新的AS軟件不僅僅要添加權(quán)限,還有單獨(dú)設(shè)置建立一個(gè)權(quán)限類(lèi),然后在讀取數(shù)據(jù)時(shí)調(diào)用它就可以了。具體如下所示
PermissionUtils.java類(lèi)
public class PermissionUtils {
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}
}
? ? ? ? 此時(shí),要設(shè)置的基本就完成了,接下來(lái)就對(duì)MovieActivity.java操控了,此界面就是顯示列表界面的數(shù)據(jù)啦,具體如下:
MovieActivity.java
public class MovieActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<Movie> movieList;
MovieAdapter movieAdapter;
private static final String TAG="MovieActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movie);
recyclerView=(RecyclerView) findViewById(R.id.recyclerview);
initData();
}
public void initData(){
//建立動(dòng)態(tài)數(shù)組存放數(shù)據(jù)
movieList=new ArrayList<>();
//獲取網(wǎng)絡(luò)視頻
Movie firstmovie=new Movie("明星大偵探","http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4");
movieList.add(firstmovie);
Movie secondmovie=new Movie("哈哈哈哈哈","https://www.dglydz.com/mov-hahahahahadierji.html");
movieList.add(secondmovie);
//獲取本工程中的視頻
Movie thirdmovie=new Movie("等到苦盡甘來(lái)時(shí),待我給你講來(lái)時(shí)的路","android.resource://"+getPackageName()+"/"+R.raw.read);
movieList.add(thirdmovie);
Movie forthmovie=new Movie("陽(yáng)光開(kāi)朗孔乙己","android.resource://"+getPackageName()+"/"+R.raw.why);
movieList.add(forthmovie);
//獲取模擬器中的視頻
Movie fifthmovie=new Movie("我會(huì)等","file:///storage/emulated/0/Pictures/waitting.mp4");
movieList.add(fifthmovie);
Movie sixthmovie=new Movie("稻香","file:///storage/emulated/0/Pictures/jay.mp4");
movieList.add(sixthmovie);
//將視頻顯示在控件上
movieAdapter=new MovieAdapter(movieList);
StaggeredGridLayoutManager layoutManager=new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(movieAdapter);
}
}
? ? ? ? (3)播放界面
? ? ? ? 新建Activity,此界面就是獲取從列表傳過(guò)來(lái)的視頻名和視頻地址,然后進(jìn)行播放,具體代碼如下:
activity_play.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PlayActivity"
android:orientation="vertical"
android:background="@drawable/back">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvmovename"
android:text="name"
android:layout_marginTop="30dp"
android:textSize="40sp"
android:gravity="center"
android:textStyle="bold"/>
<VideoView
android:layout_width="match_parent"
android:layout_height="400dp"
android:id="@+id/vvmovie"
android:layout_marginTop="10dp"/>
</LinearLayout>
PlayActivity.java
public class PlayActivity extends AppCompatActivity {
private TextView tvvedioname;
private VideoView videoView;
//媒體控制器
private MediaController mediaController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play);
tvvedioname= findViewById(R.id.tvmovename);
videoView=findViewById(R.id.vvmovie);
mediaController=new MediaController(this);
initData();
verifyStoragePermissions(this);
}
public void initData(){
//獲取從音樂(lè)列表傳過(guò)來(lái)的視頻名稱(chēng)和地址
String videoname=getIntent().getStringExtra("my");
String videouri=getIntent().getStringExtra("movieurl");
//String videourl= Environment.getExternalStorageDirectory().getAbsolutePath()+"/jay.mp4";
//Log.i("PlayActivity","videourl="+videourl);
//將視頻名稱(chēng)顯示在文本框中,將視頻地址關(guān)聯(lián)到播放器中
tvvedioname.setText(videoname);
videoView.setVideoPath(videouri);
//videoView.setVideoPath(videourl);
//將視頻播放器和媒體控制柄關(guān)聯(lián)起來(lái)
videoView.setMediaController(mediaController);
//媒體控制柄和視頻播放器關(guān)聯(lián)起來(lái)
mediaController.setMediaPlayer(videoView);
//啟動(dòng)視頻播放器播放視頻
videoView.start();
}
}
? ? ? ? 三個(gè)不同路徑(網(wǎng)絡(luò)/文件夾內(nèi)/模擬器里的視頻)的視頻的加載如下所示,具體的知識(shí)點(diǎn)就不描述了,基本代碼上都有備注。?
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-468615.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-468615.html
?
到了這里,關(guān)于Android Studio——簡(jiǎn)單視頻播放器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!