2013-01-04 92 views
1

帆布我将每个I按下按钮在屏幕上的矩形来改变位置的一次像。或者整个SurfaceView刷新。刷新SurfaceView - >上的Android OnClickListener

该应用程序似乎运行,但矩形不改变与计数器的位置。

非常感谢。

野兔是XML代码:

<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> 

这里是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) { 
     } 
    }); 
} 
} 

回答

2

好的。试试另一个解尝试制作自己的View类,在其中绘制矩形。我为你准备了一些代码。根据您的需求定制它。

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> 

和Java代码

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); 
    } 
} 

现在,当你点击按钮帆布随意移动。这是你想要的吗?

+0

非常感谢您的回答,它工作得很好,我想做一些略有不同,但主要的重新计算到矩形坐标的想法是相同的。 – Gabi

+0

不幸的是因为我的名声是低,我不能投你的答案 – Gabi

+0

我都按我想做的事,它工作得非常好只是修改了代码,再次感谢你。 – Gabi

0

尝试调用上SurfaceView Invalidate方法每个位置更改后刷新。

编辑:

而且从surfaceCreated移动位置计算到surfaceChanged方法。

+0

谢谢但Invalidate方法只适用于绘制画布。我仍然在你的第二个sugestion – Gabi

+0

工作,我也放在surfaceChanged方法的画布,但它似乎没有工作 – Gabi