Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          Android游戲開發之旅(九)VideoView類剖析

          Posted on 2010-12-03 10:24 啥都寫點 閱讀(392) 評論(0)  編輯  收藏 所屬分類: Android

          有關SurfaceView 相關的內容今天Android123繼續延用系統 的示例類VideoView來讓大家深入了解Android平臺 的圖形繪制基礎類的實現原理。大家可能會發現VideoView類的控制方面無法改變,我們可以通過重構VideoView類來實現更個性化的播放 器

          view plaincopy to clipboardprint?
          public class VideoView extends SurfaceView implements MediaPlayerControl {  
            private String TAG = "VideoView";  
            // settable by the client  
            private Uri        mUri;  
            private int        mDuration;  
            // all possible internal states  
            private static final int STATE_ERROR              = -1;  
            private static final int STATE_IDLE              = 0;  
            private static final int STATE_PREPARING          = 1;  
            private static final int STATE_PREPARED          = 2;  
            private static final int STATE_PLAYING            = 3;  
            private static final int STATE_PAUSED            = 4;  
            private static final int STATE_PLAYBACK_COMPLETED = 5;  
            // mCurrentState is a VideoView object's current state.  
            // mTargetState is the state that a method caller intends to reach.  
            // For instance, regardless the VideoView object's current state,  
            // calling pause() intends to bring the object to a target state  
            // of STATE_PAUSED.  
            private int mCurrentState = STATE_IDLE;  
            private int mTargetState  = STATE_IDLE;  
            // All the stuff we need for playing and showing a video  
            private SurfaceHolder mSurfaceHolder = null;  
            private MediaPlayer mMediaPlayer = null;  
            private int        mVideoWidth;  
            private int        mVideoHeight;  
            private int        mSurfaceWidth;  
            private int        mSurfaceHeight;  
            private MediaController mMediaController;  
            private OnCompletionListener mOnCompletionListener;  
            private MediaPlayer.OnPreparedListener mOnPreparedListener;  
            private int        mCurrentBufferPercentage;  
            private OnErrorListener mOnErrorListener;  
            private int        mSeekWhenPrepared;  // recording the seek position while preparing  
            private boolean    mCanPause;  
            private boolean    mCanSeekBack;  
            private boolean    mCanSeekForward;  
            public VideoView(Context context) {  
                super(context);  
                initVideoView();  
            }  
           
            public VideoView(Context context, AttributeSet attrs) {  
                this(context, attrs, 0);  
                initVideoView();  
            }  
           
            public VideoView(Context context, AttributeSet attrs, int defStyle) {  
                super(context, attrs, defStyle);  
                initVideoView();  
            }  
            @Override 
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
                //Log.i("@@@@", "onMeasure");  
                int width = getDefaultSize(mVideoWidth, widthMeasureSpec);  
                int height = getDefaultSize(mVideoHeight, heightMeasureSpec);  
                if (mVideoWidth > 0 && mVideoHeight > 0) {  
                    if ( mVideoWidth * height  > width * mVideoHeight ) {  
                        //Log.i("@@@", "image too tall, correcting");  
                        height = width * mVideoHeight / mVideoWidth;  
                    } else if ( mVideoWidth * height  < width * mVideoHeight ) {  
                        //Log.i("@@@", "image too wide, correcting");  
                        width = height * mVideoWidth / mVideoHeight;  
                    } else {  
                        //Log.i("@@@", "aspect ratio is correct: " +  
                                //width+"/"+height+"="+  
                                //mVideoWidth+"/"+mVideoHeight);  
                    }  
                }  
                //Log.i("@@@@@@@@@@", "setting size: " + width + 'x' + height);  
                setMeasuredDimension(width, height);  
            }  
           
            public int resolveAdjustedSize(int desiredSize, int measureSpec) {  
                int result = desiredSize;  
                int specMode = MeasureSpec.getMode(measureSpec);  
                int specSize =  MeasureSpec.getSize(measureSpec);  
                switch (specMode) {  
                    case MeasureSpec.UNSPECIFIED:  
                        /* Parent says we can be as big as we want. Just don't be larger 
                        * than max size imposed on ourselves. 
                        */ 
                        result = desiredSize;  
                        break;  
                    case MeasureSpec.AT_MOST:  
                        /* Parent says we can be as big as we want, up to specSize. 
                        * Don't be larger than specSize, and don't be larger than 
                        * the max size imposed on ourselves. 
                        */ 
                        result = Math.min(desiredSize, specSize);  
                        break;  
                        
                    case MeasureSpec.EXACTLY:  
                        // No choice. Do what we are told.  
                        result = specSize;  
                        break;  
                }  
                return result;  

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034570.aspx



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 和田市| 石河子市| 平罗县| 新余市| 澳门| 阿城市| 隆安县| 丘北县| 平南县| 图木舒克市| 巴马| 龙门县| 朝阳县| 张掖市| 清徐县| 辽宁省| 大名县| 南丰县| 青州市| 确山县| 普兰店市| 庐江县| 望都县| 临猗县| 曲水县| 阆中市| 湖州市| 安平县| 瓮安县| 怀宁县| 贡嘎县| 永吉县| 沙雅县| 沛县| 开阳县| 绥中县| 建瓯市| 稷山县| 鄂托克旗| 元阳县| 武威市|