在不影响活动的情况下旋转CustomView

时间:2017-09-26 03:33:54

标签: android android-custom-view

enter image description here enter image description here

嗨我有一个浮动窗口,我的浮动窗口用作视频,并且在浮动窗口下的视频内部还有一个控件

现在我的问题是我可以只从浮动窗口旋转自定义视图而不影响我的活动方向

如果有人已经尝试过,请指导我。

谢谢。

3 个答案:

答案 0 :(得分:0)

看起来您不希望在设备轮换时重新创建Activity。 如果是这样,那么在AndroidManifest中添加 configChanges 属性:

<activity
      ...
      android:configChanges="orientation" >

这将停止轮换时的活动重建。但是在您的活动中,您可以检查设备是否已在onConfigurationChanged()方法中旋转:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);

  // Checks the orientation of the screen
  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
    ...
  } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    ...
  }
}

不要忘记阅读android developer guides.;)

答案 1 :(得分:0)

我以前从未这样做过。但我有一个想法。您可以使用以下代码获取设备屏幕的当前方向。

OrientationEventListener onrientationEventListener = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_UI) {
            @Override
            public void onOrientationChanged(int rotation) {
                Logger.e("Orientation: " + rotation);
            }
        };

之后,取决于&#34;旋转&#34;的值,您可以在Android中使用旋转动画来旋转自定义视图。

@Beginer:这是我实现它的代码。我在我的小相机应用程序的自定义视图中使用了上面的代码。它帮助我知道在拍摄后我应该旋转位图的程度。下面的toScreenOrientation()方法返回一个度数(0,90,180,270)你自己修改它(无论你想要什么)

使用setOrientationChangedListener()方法帮助父(Activity,Fragment等)也收到回调。

public class TakePhotoView extends ConstraintLayout {

    private static final int SCREEN_ORIENTATION_0 = 0;
    private static final int SCREEN_ORIENTATION_90 = 90;
    private static final int SCREEN_ORIENTATION_180 = 180;
    private static final int SCREEN_ORIENTATION_270 = 270;

    private OnOrientationChangedListener mOnOrientationChangedListener;

    private OrientationEventListener mOrientationEventListener;

    private int mScreenRotation;

    public TakePhotoView(Context context) {
        this(context, null);
    }

    public TakePhotoView(Context context, AttributeSet attrs) {
        super(context, attrs);

        //....do something here

        mOrientationEventListener = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_UI) {
            @Override
            public void onOrientationChanged(int rotation) {
                Logger.e("Orientation: " + rotation);

                if (rotation == OrientationEventListener.ORIENTATION_UNKNOWN) {
                    mScreenRotation = DEFAULT_SCREEN_ROTATION;
                    return;
                }

                mScreenRotation = rotation;

                if(mOnOrientationChangedListener != null){
                    mOnOrientationChangedListener.onOrientationChanged(rotation);
                }
            }
        };
    }

    private void takePhoto(Camera camera) {
        if (camera != null) {
            camera.takePicture(null, null, mPictureCallback);
        }
    }

    private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            final int screenRotation = mScreenRotation;

            int rotate = toScreenOrientation(screenRotation);

            // Rotate/Flip the bitmap depends on the 'rotate' value
        }
    };

    /**
     * Converts sensor rotation in degrees to screen orientation constants.
     *
     * @param rotation sensor rotation angle in degrees
     * @return Screen orientation angle in degrees (0, 90, 180, 270).
     */
    private int toScreenOrientation(int rotation) {
        if (rotation > 290 || rotation <= 70) {
            return SCREEN_ORIENTATION_0;
        } else if (rotation > 70 && rotation <= 110) {
            return SCREEN_ORIENTATION_90;
        } else if (rotation > 110 && rotation <= 250) {
            return SCREEN_ORIENTATION_180;
        } else {
            return SCREEN_ORIENTATION_270;
        }
    }

    public void setOrientationChangedListener(OnOrientationChangedListener orientationChangedListener){
        this.mOnOrientationChangedListener = orientationChangedListener;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////
    // Interfaces
    ////////////////////////////////////////////////////////////////////////////////////////////////

    public interface OnOrientationChangedListener {
        void onOrientationChanged(int rotation);
    }
}

即使我在清单中禁用了旋转,我可以使用此侦听器吗? - &GT;它仍然可以正常工作。

希望它有所帮助。

答案 2 :(得分:0)

我找到了一种方法,但我使用了alertDailog。所有视图的逻辑都是相同的。

AlertDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.stack_overflow2);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    AlertDialog.Builder alert123 = new AlertDialog.Builder(StackOverflow2.this);
    View current_view = getLayoutInflater().inflate(R.layout.password_alert,null);
    l2 = current_view.findViewById(R.id.linearView);
    // Here l2 is linear layout getting root layout of password_alert

    alert123.setView(current_view);
    dialog = alert123.create();
    dialog.show();

    OrientationEventListener onrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_UI) {
        @Override
        public void onOrientationChanged(int rotation) {
            Log.e("Orientation: " , String.valueOf(rotation));

            if(rotation==270 || rotation==90)
            {
                if(rotation==270)
                {
                    l2.setRotation(90);
                }
                else
                {
                    l2.setRotation(270);
                }
                dialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                Toast.makeText(StackOverflow2.this, "Change Dialog Rotation", Toast.LENGTH_SHORT).show();
            }
            else
            {
                if(rotation==180)
                {
                    l2.setRotation(180);
                }
                else
                {
                    l2.setRotation(0);
                }

                Toast.makeText(StackOverflow2.this, "Normal Display to Occur", Toast.LENGTH_SHORT).show();
            }


        }
    };
    if (onrientationEventListener.canDetectOrientation()) {
        Log.v("ORIE", "Can detect orientation");
        onrientationEventListener.enable();
    } else {
        Log.v("ORIE", "Cannot detect orientation");
        onrientationEventListener.disable();
    }

}

以下是一些图片: 0度

0 Degree

90度

90 Degree

270度

270 Degree

正如您所见,背景活动始终处于potrait模式。警报对话框的高度和宽度略有偏差,但您可以更改视图的尺寸。我希望这段代码能解决你的问题。