Refresh SurfaceView-->Canvas on OnClickListener

2019-08-12 00:30发布

问题:

I would like each time I press one of the buttons the rectangles on the screen to change position. Or the entire SurfaceView to refresh.

The app seems to run but the rectangles do not change position with the counter.

Thank you very much.

Hare is the xml code:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<SurfaceView
    android:id="@+id/surface"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world"
    tools:context=".MainActivity" />
<Button
    android:id="@+id/l"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="16dp"
    android:text="L" />
<Button
    android:id="@+id/r"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="19dp"
    android:text="R" />
</RelativeLayout>

Here is the Java:

package com.example.rectangle;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
DrawView drawView;
Paint paint = new Paint();
int w, h, edge, axis_w;
int counter;
Button add, sub;
TextView display;

@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    counter = 0;
    add = (Button) findViewById(R.id.r);
    sub = (Button) findViewById(R.id.l);
    display = (TextView) findViewById(R.id.textView1);

    add.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            counter += 10;
            display.setText("Total is" + counter);

        }
    });

    sub.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            counter -= 10;
            display.setText("Total is" + counter);
        }
    });

    SurfaceView surface = (SurfaceView) findViewById(R.id.surface);

    surface.getHolder().addCallback(new Callback() {

        public void surfaceCreated(SurfaceHolder holder) {

            Canvas canvas = holder.lockCanvas();

            w = canvas.getWidth();
            h = canvas.getHeight();
            edge = 5;
            axis_w = 3;
            // canvas.drawRect(left, top, right, bottom, paint)
            // Background
            paint.setColor(Color.rgb(255, 255, 255));
            canvas.drawRect(0, 0, w, h, paint);
            // Canvas Background Color
            paint.setColor(Color.rgb(0, 206, 209));
            // Borders
            canvas.drawRect(0, 0, w, edge, paint);
            canvas.drawRect(0, h - edge, w, h, paint);
            canvas.drawRect(0, 0, edge, h, paint);
            canvas.drawRect(w - edge, 0, w, h, paint);
            // Axis
            canvas.drawRect(((w - axis_w) / 2) + counter, 0,
                    ((w + axis_w) / 2) + counter, h, paint);
            canvas.drawRect(0, (h - axis_w) / 2, w, (h + axis_w) / 2, paint);

            holder.unlockCanvasAndPost(canvas);
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
        }

        public void surfaceChanged(SurfaceHolder holder, int format,
                int width, int height) {
        }
    });
}
}

回答1:

Ok. Try Another solution. Try to make your own View class where you will draw your rectangle. I have prepared some code for you. Customize it to your needs.

Simlpe XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/mainL"
    >
<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Hello World, MainActivity"
    android:id="@+id/button"
    />
</LinearLayout>

and java code

public class MainActivity extends Activity
{
    MyRectg myRectg;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myRectg = new MyRectg(this);
        ((LinearLayout)findViewById(R.id.mainL)).addView(myRectg);
        ((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0)
        {
            myRectg.invalidate();
        }
    });
}

public class MyRectg extends View
{
    public MyRectg(Context c)
    {
        super(c);
    }

    @Override
    public void onDraw(Canvas c)
    {
        //this simulate new positions calculating
        Random rnd = new Random();
        Paint p = new Paint();
        p.setColor(Color.GREEN);
        c.drawRect(rnd.nextFloat()*100, rnd.nextFloat()*500, rnd.nextFloat()*300, rnd.nextFloat()*500, p);
    }
}

Now canvas randomly moves when you click the button. Is this what you wanted?



回答2:

Try to call Invalidate method on SurfaceView to refresh it after each position change.

EDIT:

And move position calculation from surfaceCreated to surfaceChanged method.