1. 程式人生 > >說一下視訊播放跟隨螢幕旋轉,以及activity涉及到的週期問題

說一下視訊播放跟隨螢幕旋轉,以及activity涉及到的週期問題

最近好忙,唉,廢話不多說,上程式碼

簡單來說就是判斷螢幕狀態的值

private int orientation = ActivityInfo.SCREEN_ORIENTATION_USER;

然後設定一下監聽:

MyOrientationEventListener myOrientationEventListener;

class MyOrientationEventListener extends OrientationEventListener {

        public MyOrientationEventListener(Context context, int rate) {
            super(context, rate);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onOrientationChanged(int arg0) {
            // TODO Auto-generated method stub

            L.d("onOrientationChanged生命週期實現");
            L.d(orientation);

            if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
                return;  //手機平放時,檢測不到有效的角度
            }

            orientation = ActivityInfo.SCREEN_ORIENTATION_USER;
            VideoViewPlayingActivity.this.setRequestedOrientation(orientation);
            Display display = getWindowManager().getDefaultDisplay();
            int width = display.getWidth();
            int height = display.getHeight();
            if (width > height) {
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            } else {
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            }

        }

    }

這個初始化和消除所應該放的週期

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_video_view_playing);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, POWER_LOCK);
        laughSQLiteOpenHelper = new LaughSQLiteOpenHelper(this);
        laughSQLiteOpenHelper.getWritableDatabase();
        gestureDetector = new GestureDetector(this, this);
        myOrientationEventListener = new MyOrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL);
        if (myOrientationEventListener.canDetectOrientation()) {
            myOrientationEventListener.enable();
        } else {
            Toast.makeText(VideoViewPlayingActivity.this, "Can't Detect Orientation!", Toast.LENGTH_LONG).show();
        }

        Configuration configuration = this.getResources().getConfiguration();
        int ori = configuration.orientation;


        initRock();

        Intent intent = this.getIntent();
        //獲取的資料
        url_info = intent.getStringExtra("url_info");
        id_info = intent.getStringExtra("id_info");
        image_info = intent.getStringExtra("image_info");
        title_info = intent.getStringExtra("title_info");
        good_info = intent.getStringExtra("good_info");
        collect_info = intent.getStringExtra("collect_info");
        if (intent.getStringExtra("type_info") != null) {
            type = intent.getStringExtra("type_info");
        }
        L.d("得到的圖片的網址", image_info);

        mIsHwDecode = getIntent().getBooleanExtra("isHW", false);
        Thread loadThread = new Thread(new LoadMore());
        loadThread.start();
        initTextView();
        initUI();
        //獲取的資料
        video_palying_title.setText(intent.getStringExtra("title_info"));
        initViewPager();
        /**
         * 開啟後臺事件處理執行緒
         */
        mHandlerThread = new HandlerThread("event handler thread", Process.THREAD_PRIORITY_BACKGROUND);
        mHandlerThread.start();
//        mEventHandler = new EventHandler(mHandlerThread.getLooper());

    }
銷燬的:
@Override
    protected void onDestroy() {
        super.onDestroy();
        /**
         * 退出後臺事件處理執行緒
         */
        mHandlerThread.quit();
        myOrientationEventListener.disable();
    }
然後需要根據這個數值去處理是否橫屏,怎麼橫屏
@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        L.d("onConfigurationChanged生命週期");
        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 設定當前activity為豎屏
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            //顯示其他元件
            video_playing_back.bringToFront();
            video_down_linearlayout.setVisibility(View.VISIBLE);
            video_playing_back_relativelayout.setVisibility(View.GONE);
            video_view_title.setVisibility(View.GONE);
            video_playing_back.setVisibility(View.VISIBLE);
            video_playing_back_normal.setVisibility(View.VISIBLE);
        } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 設定當前activity為橫屏
            // 當橫屏時 把除了視訊以外的都隱藏
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            //隱藏其他元件的程式碼
            video_playing_back.bringToFront();
            video_down_linearlayout.setVisibility(View.GONE);
            video_playing_back_relativelayout.setVisibility(View.VISIBLE);
            video_playing_back_relativelayout.bringToFront();
            video_view_title.setVisibility(View.VISIBLE);
            video_view_title.setText(title_info);
            video_view_title.bringToFront();
            video_playing_back.setVisibility(View.VISIBLE);
            video_playing_back_normal.setVisibility(View.GONE);
        }
    }
這裡注意的是全屏去除標題欄,非全屏再恢復,監聽的話一定要destory