私のコードは大丈夫ですが、残念ながら私のコードはnullポインタ例外を与えます。findviewbyidの前にsetcontentviewを書くことによってそれが起こらないことを知っていますが、そうすることによって私の表面は更新されません。私はこれについてたくさん検索しようとしましたが、これに対する適切な答えを得ることができません。
package com.example.snakes;
public class MainActivity extends Activity implements View.OnClickListener{
MySurfaceClass sc;
Button up,down,left,right;
//View v1,v2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
sc = new MySurfaceClass(this);
//setContentView(R.layout.activity_main);
up = (Button) findViewById(R.id.button1);
down = (Button) findViewById(R.id.button2);
left = (Button) findViewById(R.id.button3);
right = (Button) findViewById(R.id.button4);
up.setOnClickListener(this);
down.setOnClickListener(this);
left.setOnClickListener(this);
right.setOnClickListener(this);
setContentView(R.layout.activity_main);
// Toast.makeText(this, "done", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void onClick(View v) {
switch(v.getId()){
case R.id.button1:
sc.posY = sc.posY - 50 ;
Toast.makeText(this, "up", Toast.LENGTH_SHORT).show();
// sc = new MySurfaceClass(this);
// setContentView(R.layout.activity_main);
break;
case R.id.button2:
sc.posY = sc.posY + 50 ;
Toast.makeText(this, "down", Toast.LENGTH_SHORT).show();
// sc = new MySurfaceClass(this);
//setContentView(R.layout.activity_main);
break;
case R.id.button3:
sc.posX = sc.posX - 50 ;
Toast.makeText(this, "left", Toast.LENGTH_SHORT).show();
//sc = new MySurfaceClass(this);
//setContentView(R.layout.activity_main);
break;
case R.id.button4:
sc.posX = sc.posX + 10 ;
Toast.makeText(this, "right", Toast.LENGTH_SHORT).show();
//setContentView(R.layout.activity_main);
break;
}
}
}
一方、表面活動のコード:-
package com.example.snakes;
public class MySurfaceClass extends SurfaceView implements Runnable {
private SurfaceHolder sh;
private Thread t = null;
private boolean isRunning;
private Bitmap b;
protected int posX, posY;
public MySurfaceClass(Context context) {
super(context);
init();
}
public MySurfaceClass(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MySurfaceClass(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
void init() {
isRunning = true;
b = BitmapFactory.decodeResource(getResources(), R.drawable.face);
posX = 0;
posY = 0;
sh = this.getHolder();
t = new Thread(this);
t.start();
};
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawRect(100, 100, 100, 100, null);
}
public void run() {
while (isRunning) {
if (!sh.getSurface().isValid())
continue;
Canvas c = sh.lockCanvas();
c.drawRGB(5, 150, 10);
c.drawBitmap(b, posX, posY, null);
sh.unlockCanvasAndPost(c);
}
}
}
とxml:-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/grey"
android:weightSum="100" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="up"
android:layout_weight="25"/>
<Button
android:id="@+id/button2"
android:layout_weight="25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="down" />
<Button
android:id="@+id/button3"
android:layout_weight="25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="left" />
<Button
android:id="@+id/button4"
android:layout_weight="25"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="right" />
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.snakes.MySurfaceClass
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceView"
/>
</FrameLayout>