使用SurfaceHolder.setFixedSize(width,height)设置SurfaceView的大小

时间:2014-09-03 22:55:00

标签: android size surfaceview

作为MainActivity类布局的一部分,我有一个SurfaceView:

                <LinearLayout
                android:id="@+id/screen_game"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#0000FF"
                android:orientation="vertical"

                >
                           <Button
                        android:id="@+id/button15"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Button" />

                           <com.ecslayout.BackgammonBoardView
                               android:id="@+id/backgammonBoardView1"
                               android:layout_width="100dp"
                               android:layout_height="100dp" />



                </LinearLayout>

我为SurfaceView定义了一个框架类(为简单起见,我省略了很多代码)。在surfaceCreated内我尝试了许多不同的方法 设置画布的大小。画布似乎没有从100dp x 100dp改变大小。我所有调用setFixedSize的尝试似乎都没有影响大小:

            public class BackgammonBoardView extends SurfaceView implements SurfaceHolder.Callback {


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

                    Log.d(TAG,"SurfaceView Constructor.");

                    //register out interest in hearing about changes to our surface
                    SurfaceHolder holder = getHolder();
                    holder.addCallback(this);

                }


                //The method is firing just fine. I have the surfaceCreated output from Log.d
                @Override
                public void surfaceCreated(SurfaceHolder arg0) {

                    //Has no effect on size
                    //this.getHolder().setFixedSize(500, 500);

                    //Has no effect on size
                    //arg0.setFixedSize(500, 500);

                    //Has no effect on size
                    //SurfaceHolder holder = getHolder();
                    //holder.setFixedSize(500, 500);

                    //Has no effect on size
                    /*getHolder().setFixedSize(500,
                            500);*/

                    //Causes Eclipse to enter Debug mode. It crashes the program
                    //android.widget.FrameLayout.LayoutParams params = new android.widget.FrameLayout.LayoutParams(500, 500);
                    //setLayoutParams(params);

                    thread.start();
                    Log.d(TAG,"SurfaceView. surfaceCreated.");
                }


            }

关于setFixedSize的一个问题是函数的参数代表什么单位?是点的点还是像素的int?我正在阅读文档:

http://developer.android.com/reference/android/view/SurfaceHolder.html

然而它只是说setFixedSize的参数是整数。我还没有看到它描述整数可能代表什么单位的地方。我是否可能尝试从错误的位置设置SurfaceView的大小  还是有其他问题?我正在开发目标API 19,最小API为9。

P.S。我想我现在看到的是什么setFixedSize()改变了画布的分辨率,但没有像我想要的那样改变LinearLayout中的宽度和高度。我已经在后面的代码中获得了屏幕宽度和高度,我打算做的是更改SurfaceView中存在的SurfaceView的宽度和高度。

P.P.S。我打算在ScrollView中使用SurfaceView,但我现在正在阅读这种方法可能无法实现。我从这篇文章中发现了更多信息:

https://groups.google.com/forum/#!msg/android-developers/zkdnM0G225I/tt_FJGyOkB4J

谢谢

1 个答案:

答案 0 :(得分:6)

您可以覆盖SurfaceView类的onSizeChanged()函数以获取&amp;设置视图的大小。

protected void onSizeChanged (int w, int h, int oldw, int oldh)

当屏幕尺寸发生变化时,会调用此类。

我还注意到你的xml代码有:

android:layout_width="100dp"
android:layout_height="100dp"

这可能是您无法更改大小的原因。

作为第二种选择,您可以通过设置布局参数来设置大小(不确定这是否适用于ScrollView):

@Override
public void surfaceCreated(SurfaceHolder holder) {
    android.view.ViewGroup.LayoutParams lp = this.getLayoutParams();
    lp.width = 1000; // required width
    lp.height = 1000; // required height
    this.setLayoutParams(lp);
}