1. 程式人生 > >android 視訊和圖片切換並進行自動輪播

android 視訊和圖片切換並進行自動輪播



剛入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方法,根據msgwhat的值判斷是否執行後續操作
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);
}
        }
}