androidstudioでandroidアプリを開発しており、xmlファイルで作成したsurfaceView上でのタッチを認識させたいのですがうまくいきません。ログを見てもタッチが反応されていない状態でした。onTouchEventをdispatchTouchEventに変えてみてもダメでした。どなたかわかる方いらっしゃいますか?
言語 JAVA
コード
package com.example.pbl_app;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.PlaybackParams;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
public class SubActivity extends MainActivity {
boolean play = false;
int cx = 515, cy = 485;
private SurfaceView surfaceView;
private MySurfaceView mySurfaceView;
PlaybackParams params = new PlaybackParams();
public long moveX,moveY=0;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.next_activity); surfaceView = (SurfaceView) findViewById(R.id.surfaceViewSub); mySurfaceView = new MySurfaceView(this,surfaceView); final Button PButton = findViewById(R.id.PlayButton); final Button EButton = findViewById(R.id.ExitButton); PButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditVoice(); if (play) { stopPlaying(); play = true; } else { startPlaying(); play = false; } } }); } private void startPlaying() { try { player.setDataSource(fileName); player.setPlaybackParams(params); player.prepare(); player.start(); } catch (IOException e) { player.release(); player = null; } } private void stopPlaying() { player.release(); player = null; } public void EditVoice() { params.setPitch(3.f); params.setSpeed(2.f); } public class MySurfaceView extends SurfaceView //SurfaceViewを描画するクラス implements Runnable, SurfaceHolder.Callback { Canvas canvas = null; private float width,height; public Paint mPaint = new Paint(); public Paint ballPaint = new Paint(); static final int BALL_R = 20;//ボールの大きさ Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.picture1); SurfaceHolder holder; Thread thread; StringBuilder msg = new StringBuilder(); public MySurfaceView(Context context, SurfaceView surfaceView) { super(context);//コンストラクタ。SurfaceView描画に用いるコールバックを登録する。 holder = surfaceView.getHolder(); holder.addCallback(this); } @Override public void run() { ballPaint.setStyle(Paint.Style.FILL); ballPaint.setColor(Color.RED); while (thread != null) { doDraw(holder); } } @Override public void surfaceCreated(SurfaceHolder holder) { thread = new Thread(this); thread.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { thread = null; } private void doDraw(SurfaceHolder holder) { if (thread != null) { canvas = holder.lockCanvas(); if(moveX < 0 || moveX < this.width ) { cx += moveX; } if(moveY < 0 || moveY < this.height ) { cy += moveY; } canvas.drawBitmap(bmp, 0, 0, mPaint); canvas.drawCircle(cx,cy,BALL_R,ballPaint); holder.unlockCanvasAndPost(canvas); } } @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()){ case MotionEvent.ACTION_DOWN: msg.append(event.getX()); mPaint.setColor(Color.BLACK); canvas.drawCircle(cx,100,BALL_R,mPaint); Log.v("DOWN,X\n",msg.toString()); break; case MotionEvent.ACTION_MOVE: moveX += event.getX(); moveY += event.getY(); msg.append(event.getY()); Log.v("Y",msg.toString()); break; default: break; } return true; } }
}
あなたの回答
tips
プレビュー