android 視訊和圖片切換並進行自動輪播
阿新 • • 發佈:2019-02-06
剛入android沒多久,遇到的比較鬱悶的問題就是子執行緒主執行緒的問題,更改UI介面,本想做一個圖片的輪播但是比較簡單,然後就試試實現視訊跟圖片切換播放進行不停的迴圈播放。也用過不少控制元件,但是知其然不知其所以然,後來自己寫了一段來實現圖片視訊互相切換輪播。在這寫下一篇部落格也當自己學習的過程.希望大家多多指教希望
下面程式碼:
xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/RelativeLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context="com.lishu.handler.MainActivity" > <ImageView android:id="@+id/imgchange" android:layout_width="500px" android:layout_height="500px" /> <VideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone"/> </RelativeLayout>
在android5.1版本中會出現一定的錯誤。
07-27 03:08:58.413 3450-3475/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe0 in tid 3475 (Binder_2)
07-27 03:08:59.537 3528-3546/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe0 in tid 3546 (Binder_2)
[ 07-27 03:08:59.540 1166: 1166 E/ ]
invalid crash request of size 0 (from pid=3528 uid=0)
而在android高階一點的版本就沒有這個問題 。也不知道是什麼情況。。。 此貼算是拋磚引玉貼。
MainActivity.java
package com.lishu.handler; import android.app.Activity; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.VideoView; import java.util.Timer; import java.util.TimerTask; import static android.content.ContentValues.TAG; public class MainActivity extends Activity { private ImageView imgchange; private Timer timer = new Timer(); private TimerTask task; private VideoView videoView; private int flag = 0; //定義切換的圖片的陣列id int imgids[] = new int[]{R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four, R.drawable.five,}; int imgstart = 0; private Handler myHandler = new Handler() { @Override //重寫handleMessage方法,根據msg中what的值判斷是否執行後續操作 public void handleMessage(Message msg) { if (msg.what == 0) { Log.d("資料", String.valueOf(imgstart)); imgchange.setImageResource(imgids[imgstart++]); }else if(msg.what == 1){ flag = 2;//首先要將這個標籤換掉 不然會出現因為定時器的原因導致視訊播放不全的問題。 Log.d("測試", String.valueOf(flag)); imgchange.setVisibility(View.GONE); videoView.setVisibility(View.VISIBLE); initData();//播放視訊的方法 }else{ Log.d("測試", "啥我也不幹 空定時器" ); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imgchange = (ImageView) findViewById(R.id.imgchange); videoView = findViewById(R.id.videoView); start(); } /**選擇播放圖片還是播放視訊*/ public void start() { task = new TimerTask() { @Override public void run() { if (imgstart < imgids.length) { Log.d(TAG, "length" +imgids.length ); Message msg = Message.obtain(); msg.what = 0; myHandler.sendEmptyMessage(flag); Log.d(TAG, "flag" +flag ); } else { if(flag == 2){ myHandler.sendEmptyMessage(flag); //啥也不幹 }else { flag = 1; Log.d("測試", String.valueOf(flag)); myHandler.sendEmptyMessage(flag); //播放視訊 } } } }; //定時器開始執行 timer.schedule(task,0,5000); } //播放視訊 private void initData() { String uri = "android.resource://" + getPackageName() + "/" + R.raw.b; videoView.setVideoURI(Uri.parse(uri)); //開始播放 videoView.start(); //播放完成回撥 videoView.setOnCompletionListener(new MyPlayerOnCompletionListener()); //防止出現視訊播放錯誤的問題 videoView.setOnErrorListener(videoErrorListener); } //防出現無法播放此視訊視窗 public MediaPlayer.OnErrorListener videoErrorListener = new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { return true; } }; //回撥方法 private class MyPlayerOnCompletionListener implements MediaPlayer.OnCompletionListener { @Override public void onCompletion(MediaPlayer mp) { /**再次啟動圖片的輪播,設定了imgstart為初始值*/ /**多個視訊可以在這進行切換,進行一次判斷加入還有視訊就播放,沒有就走下面這一段*/ imgstart = 0; flag = 0; imgchange.setVisibility(View.VISIBLE); videoView.setVisibility(View.GONE); } } }