Android如何 只让TextView横屏其他不动?

我是想弄个用MP4 作为聊天背景的,然后文字可旋转90度(即横屏、竖屏),但是我不想背景的MP4或者图片也跟着旋转90度啊!
下面将所有的试验代码全部贴出:

package CustomControl;


import android.content.Context;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.VideoView;

/**
 * 自定义控件
 */
public class LGvideoview extends VideoView {
    public LGvideoview(Context context) {
        this(context,null);
    }
    public LGvideoview(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public LGvideoview(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
    }
    public LGvideoview(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //我们重新计算高度
        int width = getDefaultSize(0, widthMeasureSpec);
        int height = getDefaultSize(0, heightMeasureSpec);
        setMeasuredDimension(width, height);
    }
    @Override
    public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) {
        super.setOnPreparedListener(l);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return super.onKeyDown(keyCode, event);
    }
}

Activity页面:


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <CustomControl.LGvideoview
        android:id="@+id/lg_Videoview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="100sp"
        android:textColor="@color/white"
        android:text="Fuck!"/>


</FrameLayout>


页面后台的java代码:


package com.lkfcode.myhelper;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.VideoView;

/*
https://blog.csdn.net/CChuXueZhe2034/article/details/106979545
 */
public class TestMp4BkActivity extends AppCompatActivity {
    private VideoView g_LGvideoview;
    private TextView g_tvmsg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_mp4_bk);

        horizontalMethod();
        this.g_tvmsg = findViewById(R.id.tv_msg);
        this.g_LGvideoview = (VideoView)findViewById(R.id.lg_Videoview);
        initVideView();
    }
    /**
     * 设置竖屏
     */
    private void verticalMethod(){
        if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }

    /**
     * 设置横屏
     */
    private void horizontalMethod(){
        if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT){
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
    }

    /**
     * 播放视频
     */
    private void initVideView(){
        //根据文件路径播放
        //if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
        //    g_LGvideoview.setVideoPath(Environment.getExternalStorageDirectory() + "/lesson.mp4");
        //}

        //播放路径
        g_LGvideoview.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.liu_fang_ti));
        //播放
        g_LGvideoview.start();
        //循环播放
        g_LGvideoview.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                g_LGvideoview.start();
            }
        });
    }
    private void playMp4Internet(){
        /*
        播放网上的MP4:
        需要权限
       <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
*/
        MediaController l_m = new MediaController(this);
        l_m.setAnchorView(g_LGvideoview);
        Uri l_uri = Uri.parse("https://qiniu-xpc.xpccdn.com/5b4c8f1691dea.mp4");
        g_LGvideoview.setMediaController(l_m);
        g_LGvideoview.setVideoURI(l_uri);
        g_LGvideoview.start();
    }
    @Override
    protected void onRestart() {
        //返回重新加载
        initVideView();
        super.onRestart();
    }


    @Override
    protected void onStop() {
        //防止锁屏或者弹出的时候,音乐在播放
        g_LGvideoview.stopPlayback();
        super.onStop();
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        switch (newConfig.orientation){
            case Configuration.ORIENTATION_PORTRAIT:
                this.g_tvmsg .setText("当前屏幕为竖屏方向");
                break;
            case Configuration.ORIENTATION_LANDSCAPE:
                this.g_tvmsg .setText("当前屏幕为横屏方向");
                break;
            default:
                break;
        }
    }
}
  • 这篇博客: 【我的Android进阶之旅】如何自定义一个45度旋转的TextView,实现类似右上角文字角标的效果中的 3.4 在Activity中控制旋转角度,以及替换背景 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • package com.oyp.view;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    
    public class MainActivity extends Activity {
        RotateTextView mText;
        TextView degrees;
        boolean isFirst = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mText = (RotateTextView) findViewById(R.id.rotate_textview);
            degrees = (TextView) findViewById(R.id.rotate_degrees);
            SeekBar sbLean = (SeekBar) findViewById(R.id.sb_rotate);
            sbLean.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    mText.setDegrees(progress);
                    degrees.setText("倾斜度:" + progress);
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
    
                }
            });
            findViewById(R.id.bt_change_bg).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mText.setBackgroundResource(isFirst ? R.drawable.backgroud2 : R.drawable.backgroud);
                    isFirst = !isFirst;
                }
            });
    
        }
    
    }
    
    

您可以使用Android中的SurfaceView来实现将MP4作为聊天背景,同时在上面叠加TextView,并保持MP4静止不旋转的功能。

首先,您需要创建一个自定义的SurfaceView类并在其构造函数中设置以下内容:

public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    //MediaPlayer to play background video
    private MediaPlayer mMediaPlayer;

    public CustomSurfaceView(Context context) {
        super(context);
        getHolder().addCallback(this);
        //To make sure background video doesn't rotate with screen orientation
        setZOrderOnTop(true);
        getHolder().setFormat(PixelFormat.TRANSPARENT);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            //Set up MediaPlayer to play background video
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(mContext, Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.background_video)); 
            // Replace R.raw.background_video with the ID of your MP4 file
            mMediaPlayer.setDisplay(holder);
            mMediaPlayer.prepare();
            // Looping the background video
            mMediaPlayer.setLooping(true);
            
            // Start playing background video
            mMediaPlayer.start();

            Log.d(TAG, "Background video started!");
        } catch (IOException e) {
            Log.e(TAG, "Error starting background video", e);
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //Left empty intentionally
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //Stop playing the background video
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }
}


在此类中,我们使用 MediaPlayer 来播放您的MP4文件。通过设置解码器和视频源,可以准备启动MediaPlayer来播放视频。我们将它们显示在SurfaceView上。

接下来,在您的Activity的XML布局文件中添加CustomSurfaceView并设置相应的属性。