【问题标题】:How to pass parameters to SurfaceView from main activity in Android如何从Android中的主要活动将参数传递给SurfaceView
【发布时间】:2017-12-15 03:17:15
【问题描述】:

我需要使用 surfaceview 绘制折线图,​​因此从主要活动中我将按照这个 [link][1] 解决方案将 2 个参数传递给 surfaceview

[1]: Passing arguments to SurfaceView via Constructor 但是我在surfaceview draw方法中传递的参数仍然是0,请帮助

MySurfaceView.java: 私人 int len,theta;

public void setParameter(int length, int angle){
    this.len = length;
    this.theta = angle;
    System.out.println("inside setParameter, len: "+len+" ,theta: "+theta);
}
protected void drawSomething(Canvas canvas) {

    System.out.println("Inside drawSomething() , len: "+len+" ,theta: "+theta);

    canvas.drawColor(Color.WHITE);

} MainActivity.java

MySurfaceView myView = new MySurfaceView(MainActivity.this);
                    myView.setParameter(90,30);
                    myView.invalidate();

值仅在 setParameter() 内而不在 drawSomething() 内打印,我需要在 drawSomething() 内使用这些值,请帮助 在下面编辑了我的代码,

public MySurfaceView(Context context) {
    super(context);
    init();
}
private void init(){

    paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setStrokeWidth(3);
    paint.setStyle(Paint.Style.STROKE);

    surfaceHolder = getHolder();
    surfaceHolder.addCallback(new SurfaceHolder.Callback(){

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            canvas = holder.lockCanvas(null);
            drawSomething(canvas);
            holder.unlockCanvasAndPost(canvas);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder,
                                   int format, int width, int height) {
            // TODO Auto-generated method stub
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
        }});
}

【问题讨论】:

  • drawSomething(Canvas canvas)在哪里调用?
  • @andras drawSomething 在 init() 方法中被调用, init() 在构造函数中被调用,我通过编辑我的问题添加了这些代码。在 init() 内部我也尝试打印这些值但没有运气

标签: android android-activity parameters parameter-passing surfaceview


【解决方案1】:

由于drawSomething(canvas)在回调中被调用,你无法知道它是否会在你的下一个函数setParameter(int, int)之前被调用。

如果你想让drawSomething(canvas) 的值可用,你必须在MySurfaceView 的构造函数中传递它们,或者扩展类SurfaceHolder.Callback 并将值传递给它们。

【讨论】:

  • 您从代码中创建视图,因此只需使用MySurfaceView(Context context, int length, int angle) 创建一个构造函数。
  • 根据您的建议,我创建了构造函数,public MySurfaceView(Context context,int length,int angle) { super(context); len = 长度; θ = 角度;初始化(长度,θ); } 并使用传递的参数调用 init() 方法
  • 但是当我用 AttributeSet 删除另一个构造函数时,public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs);在里面(); } 它抛出错误'java.lang.NoSuchMethodException: [class android.content.Context, interface android.util.AttributeSet]'
  • 这意味着,您已经在 xml 中声明了视图。不过那不是你说的。这是您可以在 xml 案例中遵循的答案:stackoverflow.com/a/8090772/4420543
  • 是的,我在 xml 中将视图声明为, 在 activity_main.xml 中,我读过该链接,但我仍然对如何使用构造函数感到困惑,你能帮我吗
猜你喜欢
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多