0

在我的应用程序中,我必须提供添加、移动、调整大小和删除某些视图的功能,就像启动器一样。到目前为止它工作得很好,但现在我希望其中一些视图显示实时流式传输的视频(如网络摄像头)。

我希望我的视频在更改屏幕方向时不要重新缓冲,所以我尝试使用 android:configChanges="orientation|screenSize" 属性。

它在大多数情况下都有效,但是...问题是我必须在屏幕方向更改时或在 onResume 函数中获取新尺寸。这有点棘手,而且它并不总是有效(例如,如果我处于横向模式,并且我接到电话,Android 会自动切换到纵向模式,当我回到我的应用程序时,它会保持纵向但是给我横向屏幕尺寸……)。

我尝试同时使用 addOnLayoutChangeListener 和 getViewTreeObserver().addOnGlobalLayoutListener,都失败了。

我想它在其他几种情况下可能有问题,所以我认为完美的行为是具有正常行为(例如,如果方向改变,则在 onResume 中销毁并重新创建我的活动),并且仅在以下情况下手动调整我的视图大小方向改变。

所以我的问题是:

  • 你认为尝试得到这种行为是个好主意吗?

  • 销毁和重新创建活动的最佳方法是什么?如果方向改变,只需在 onResume 中调用 onDestroy/onCreate 吗?或者手动将我所有的指针设置为空,并且要非常小心内存泄漏......</p>

先感谢您

4

1 回答 1

0

好吧,我通过创建自己的布局类并在其 onDraw 函数中获取大小来解决它。有点矫枉过正,但这是我找到的唯一解决方案。

感谢@Sharad Mhaske 和@Class Stacker 抽出宝贵时间!

编辑:我刚刚意识到我没有提到我通过设置它们的 X 和 Y 位置以及它们的宽度和高度来手动将我的视图放置在他们的容器中。这就是为什么它们不会自动调整大小而容器会自动调整大小的原因。

编辑:这是我现在使用的一段代码:

public class TilesContainer extends FrameLayout {

    // ------------------------------------------------------------------------------------------
    // Public interface for on size change event :
    public static interface OnSizeChangedListener { void onSizeChanged(int width, int height); }
    // ------------------------------------------------------------------------------------------



    // ------------------------------------------------------------------------------------------
    // Private attributes :
    private int _width = -1;
    private int _height = -1;
    private OnSizeChangedListener _listener = null;
    // ------------------------------------------------------------------------------------------



    // ------------------------------------------------------------------------------------------
    // Constructors :
    public TilesContainer(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);
        this.setWillNotDraw(false);
    }

    public TilesContainer(Context context, AttributeSet attrs) {

        super(context, attrs);
        this.setWillNotDraw(false);
    }

    public TilesContainer(Context context) {

        super(context);
        this.setWillNotDraw(false);
    }
    // ------------------------------------------------------------------------------------------


    // ------------------------------------------------------------------------------------------
    // Setters :
    public void setOnSizeChangedListener(OnSizeChangedListener listener) { _listener = listener; }
    // ------------------------------------------------------------------------------------------



    // ------------------------------------------------------------------------------------------
    // onDraw overload :
    @Override
    protected void onDraw(Canvas canvas) {

        // Call super :
        super.onDraw(canvas);

        // If there is a listener and if the size changed :
        if(_listener != null && (_width != this.getWidth() || _height != this.getHeight()) ) {

            _width = this.getWidth();
            _height = this.getHeight();
            _listener.onSizeChanged(this.getWidth(), this.getHeight());
        }
    }
    // ------------------------------------------------------------------------------------------
}

现在在活动中,只需实现 OnSizeChangedListener,使用 setter 并添加函数:

@Override
public void onSizeChanged(int width, int height) {

    // Do your stuff with the GOOD size !
}
于 2013-04-23T16:13:39.490 回答