当前位置:操作系统 > 安卓/Android >>

android videoview,旋转 视频 orientation,rotation 等

最近一直在研究android编程中有关 视频的旋转的操作,目前仍然没有完成目标: 在某一个界面中的某个小区域中的videoview,想让这个videoview中的视频旋转90度。

 

尝试的方法有:


1,直接旋转某个 view,    即修改view的属性orientation, framelayout是没有orientation这个属性的,linearlayout有这个属性,可以成功的改变orientation,但是实际效果并不如人意啊,layout中所有的东西都转过来了,唯独视频没有旋转90度过来,无比郁闷。

2.  尝试使用animation动画,实际效果是旋转那个videoview, 那个videoview倒是旋转了,但是其中的视频仍然是无动于衷

3.  试试旋转整个屏幕: 实现这个目标并不是很难,  在manifest.xml中,activity的属性里添加

android:configChanges="orientation"和

android:screenOrientation="sensor"

然后在 代码里相应的添加:


public void onConfigurationChanged(Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

}

记住,例如代码中那种
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

是不可以出现的,不然此方法就失效。
就ok了,实际效果就是, 当手机由横着  转动90度到  竖着的时候,整个界面都转动了,效果不错! 视频也跟着旋转了90度。

但是……我的需求貌似是:只旋转视频,而且是在手机不动的情况下。

 

4. 在stackflow看到的一个帖子,那哥们遇到的问题和我的类似……唯一的区别是他是要全屏播放啊…… 那他就不用考虑其他控件一起旋转的问题了,他那个问题只需要resize一下视频+ 上述方案3就可以了嘛, 用videoview来播放视频,那个解决方案的代码:
[java] 
public class VideoViewCustom extends VideoView { 
 
    private int mForceHeight = 0; 
    private int mForceWidth = 0; 
    public VideoViewCustom(Context context) { 
        super(context); 
    } 
 
    public VideoViewCustom(Context context, AttributeSet attrs) { 
        this(context, attrs, 0); 
    }   www.zzzyk.com
 
    public VideoViewCustom(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 
 
    public void setDimensions(int w, int h) { 
        this.mForceHeight = h; 
        this.mForceWidth = w; 
 
    } 
 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
        Log.i("@@@@", "onMeasure"); 
 
        setMeasuredDimension(mForceWidth, mForceHeight); 
    } 

和这一段代码:

[java] 
@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
 
        questionVideo.setDimensions(displayHeight, displayWidth); 
        questionVideo.getHolder().setFixedSize(displayHeight, displayWidth); 
 
    } else { 
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 
 
        questionVideo.setDimensions(displayWidth, smallHeight); 
        questionVideo.getHolder().setFixedSize(displayWidth, smallHeight); 
 
    } 

这两段代码的主要工作就是重新扩展了一下videoview这个class,然后在屏幕旋转的时候, 可以自动把视频resize一下。(注意在xml中的用packagename.newclass才能保证xml中的标签可以正确绑定到代码的class中)
5  最新的API,貌似在api level16才有? 反正level10,也就是2.3.3是用不了的

android.media.effect
官网说明在:http://developer.android.com/reference/android/media/effect/package-summary.html
好吧,看了一通详细说明,貌似还是只有对image有效,一直没有说video字眼啊……

 

6.直接旋转掉某Layout,在xml中用上此layout

[java] 
public class RotateLayout extends FrameLayout { 
    private Matrix mForward = new Matrix(); 
    private Matrix mReverse = new Matrix(); 
    private float[] mTemp = new float[2]; 
 
    public RotateLayout(Context context) { 
        super(context); 
    } 
 
    public RotateLayout(Context context, AttributeSet attrs) { 
        super(context, attrs); 
 
    } 
 
 
    /* (non-Javadoc)
     * @see android.widget.FrameLayout#onMeasure(int, int)
     */ 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
        super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
        //This didn't work: 
        //super.onMeasure(heightMeasureSpec, widthMeasureSpec); 
    } 
 
    /* (non-Javadoc)
     * @see android.widget.FrameLayout#onSizeChanged(int, int, int, int)
     */ 
    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
        super.onSizeChanged(w, h, oldw, oldh); 
    } 
 
    @Override 
    protected void dispatchDraw(Canvas canvas) { 
        canvas.rotate(270, getWidth()/2, getHeight()/2); 
        //This code will stretch the canvas to accommodate the new screen size. This is not what I want. 
        //float scaleX=(float)getHeight()/getWidth(); 
        //float scaleY=(float)getWidth()/getHeight(); 
        //canvas.scale(scaleX, scaleY,  getWidth()/2, getHeight()/2); 
        mForward = canvas.getMatrix(); 
        mForward.invert(mReverse); 
        canvas.save(); 
      &nb

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,