これは私のxmlファイルです
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout0"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CanvasActivity"
android:baselineAligned="false">
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#f9dfcb">
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="#000000"
>
</LinearLayout>
</LinearLayout>
私の活動コード
import android.app.Activity;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.Toast;
public class CanvasActivity extends Activity {
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_canvas);
gestureDetector = new GestureDetector(this, new GestureListener());
LinearLayout LinearLayout1=(LinearLayout)findViewById(R.id.LinearLayout1);
LinearLayout1.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
if (gestureDetector.onTouchEvent(event))
{
return true;
}
return false;
}
});
/*********EDITED*******/
LinearLayout LinearLayout2=(LinearLayout)findViewById(R.id.LinearLayout2);
int width=LinearLayout2.getWidth();
int height=LinearLayout2.getHeight();
LinearLayout2.addView(new Canvasview(this), width, height) ;
LinearLayout2.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View v, MotionEvent event){
Canvasview cv= new Canvasview(v.getContext());
cv.onTouchEvent(event);
return true;
}
});
}
//discerning swipes
class GestureListener extends SimpleOnGestureListener
{
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY)
{
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
//From Right to Left
Toast.makeText(CanvasActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
return true;
}
else if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE &&
Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
//From Bottom to Top
Toast.makeText(CanvasActivity.this, "Top Swipe", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
@Override
public boolean onDown(MotionEvent e)
{
return true;
}
}
}
私のキャンバスビューは次のようになります
public class Canvasview extends SurfaceView implements SurfaceHolder.Callback{
private int width, height;
private Paint textPaint = new Paint();
private Paint touchPaint = new Paint();
private int colors[] = new int[10];
public Canvasview(Context context) {
super(context);
SurfaceHolder holder = getHolder();
holder.addCallback(this);
setFocusable(true); // make sure we get key events
setFocusableInTouchMode(true); // make sure we get touch events
init();
}
private void init()
{
textPaint.setColor(Color.WHITE);
colors[0] = Color.RED;
touchPaint = new Paint();
touchPaint.setColor(colors[0]);
}
public boolean onTouchEvent(MotionEvent event)
{
Canvas c = getHolder().lockCanvas();
if (c != null)
{
if (event.getAction() == MotionEvent.ACTION_UP)
{
// clear everything
}
else
{
int xval = (int)event.getX();
int yval = (int)event.getY();
drawCircle(xval,yval,touchPaint,c);
}
getHolder().unlockCanvasAndPost(c);
}
return true;
}
public void clear(Canvas c){
c = getHolder().lockCanvas();
c.drawColor(Color.BLACK);
getHolder().unlockCanvasAndPost(c);
}
private void drawCircle(int x, int y, Paint paint, Canvas c)
{
c.drawCircle(x, y, 2, paint);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
Canvas c = getHolder().lockCanvas();
if (c != null)
{
// clear screen
c.drawColor(Color.BLACK);
getHolder().unlockCanvasAndPost(c);
}
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
}
}
キャンバスが必要なのは linearlayout2 だけですが、キャンバスが画面全体を占めています。どこが間違っているのかわかりません。
編集:まあ、私はいくつかの変更を行い、linearlayout2 で Canvasview を取得します。Canvasview の ontouchevents はタッチイベントを検出しますが、Canvasview public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) メソッドはキャンバスを初期化しないため、常にヌルです。描画するには、キャンバスがnullにならないようにする必要があります。どんな助けでも大歓迎です