Rotate View Hierarchy 90 degrees

后端 未结 6 965
予麋鹿
予麋鹿 2020-11-28 03:33

I am working on a subclass of FrameLayout that is supposed to rotate all of its children by 90 degrees. I am doing this to overcome the landscape-only camera limitation pres

6条回答
  •  春和景丽
    2020-11-28 04:16

    This is what has worked for me in general.

    private void init() {
        setRotation(90f);
    }
    
    public YourViewOrViewGroup(final Context context) {
        super(context);
        init();
    }
    
    ... (all the View/ViewGroup constructors) ...
    
    @Override
    protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) {
        super.onLayout(changed, l, t, r, b);
    
        final int width = getWidth();
        final int height = getHeight();
        final int offset = Math.abs(width - height) / 2;
        setTranslationX(-offset);
        setTranslationY(offset);
    }
    
    @Override
    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
        super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    }
    

    What you want to do is swap the width with height and then put the X & Y offsets so that the view becomes full screen after the rotation.

    The above is a 'landscape'-rotated version. To achieve a landscape inverted just apply 270-deg rotation. You can either modify code within the snippet or apply the rotation outside in a more generic way, i.e

    final YourViewOrViewGroup layout = inflater.inflate(...);
    if (currentOrientation.isInverted()) {
        layout.setRotation(layout.getRotation + 180f);
    }
    

    this way you are able to embed the rotated View/ViewGroup within the xml definition and inflate 'port' and 'land' versions while the screen orientation changes, but this seems out of this topic.

    Edit: actually it is much better to defer the offset setting until at least one layout pass is over. This is due the fact that in my case after first onMeasure() the view would be drawn (before the offsets were set). Eventually it could be experienced as glitching because the view/layout would not get drawn within the final bounds at first. (updated the snippet)

提交回复
热议问题