java - OnTouch 监听器不会更改位图位置

标签 java android bitmap

我有一个 "Board.java" 类,它是一个 Activity ,还有一个 "MySurfaceView.java",它是一个 SurfaceView。我正在 SurfaceView 上绘制一些位图,我想在触摸屏幕时移动它(到触摸的地方)。它绘制了位图,但在触摸之后,没有任何反应。
提前致谢!

日志:

Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=539.47266, y[0]=978.45703, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=90656, downTime=88761, deviceId=0, source=0x1002 }

Board.java:

    package com.myfirstapplication.owner.appversion1;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

/**
 * Created by Owner on 15/06/2016.
 */

public class Board extends AppCompatActivity implements View.OnTouchListener {
    TextView tv;
    MySurfaceView mv;
    Bitmap bp;
    float x, y;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mv = new MySurfaceView(this);
        mv.setOnTouchListener(this);
        bp = BitmapFactory.decodeResource(getResources(), R.drawable.missile_cartoon);
        x = 0;
        y = 0;
        setContentView(mv);

    }

    @Override
    protected void onPause() {
        super.onPause();
        mv.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mv.resume();
    }


    @Override
    public boolean onTouch(View v, MotionEvent event) {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        x = event.getX();
        y = event.getY();

        return true;
    }

   }

MySurfaceView.java:

    package com.myfirstapplication.owner.appversion1;

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.graphics.Path;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;

/**
 * Created by Owner on 16/06/2016.
 */
public class MySurfaceView extends SurfaceView implements Runnable {
    float x, y;
    Bitmap bp;
    Thread t = null;
    SurfaceHolder holder;
    boolean isItOK = false;


    public MySurfaceView(Context context) {
        super(context);
        Bitmap bpOld = BitmapFactory.decodeResource(getResources(), R.drawable.missile_cartoon);
        bp = Bitmap.createScaledBitmap(bpOld, 250, 250, true);
        x = 0;
        y = 0;
        holder = getHolder();
    }


    @Override
    public void run() {
        while(isItOK){
            if(!holder.getSurface().isValid())
                continue;
            Canvas c = holder.lockCanvas();
            c.drawARGB(255,150,150,10);
            c.drawBitmap(bp,x-(bp.getWidth()/2),y-(bp.getHeight()/2),null);
            holder.unlockCanvasAndPost(c);
        }
    }

    public void pause() {
        isItOK = false;
        while(true){
            try{
                t.join();
            }
            catch (InterruptedException e){
                e.printStackTrace();
            }
            break;
        }
        t = null;
    }

    public void resume() {
        isItOK = true;
        t = new Thread(this);
        t.start();
    }



}

最佳答案

移除 Board 中的 TouchListener

董事会:

public class Board extends AppCompatActivity{

MySurfaceView mv;
Bitmap bp;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mv = new MySurfaceView(this);
    bp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
    setContentView(mv);

}

@Override
protected void onPause() {
    super.onPause();
    mv.pause();
}

@Override
protected void onResume() {
    super.onResume();
    mv.resume();
}
}

在 MySurfaceView 中

public class MySurfaceView extends SurfaceView implements Runnable {
float x, y;
Bitmap bp;
Thread t = null;
SurfaceHolder holder;
boolean isItOK = false;


public MySurfaceView(Context context) {
    super(context);
    Bitmap bpOld = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
    bp = Bitmap.createScaledBitmap(bpOld, 250, 250, true);
    x = 0;
    y = 0;
    holder = getHolder();
}


@Override
public void run() {
    while(isItOK){
        if(!holder.getSurface().isValid())
            continue;
        Canvas c = holder.lockCanvas();
        c.drawARGB(255,150,150,10);

        c.drawBitmap(bp,x-(bp.getWidth()/2),y-(bp.getHeight()/2),null);
        holder.unlockCanvasAndPost(c);
    }
}

public void pause() {
    isItOK = false;
    while(true){
        try{
            t.join();
        }
        catch (InterruptedException e){
            e.printStackTrace();
        }
        break;
    }
    t = null;
}

public void resume() {
    isItOK = true;
    t = new Thread(this);
    t.start();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    x = event.getX();
    y = event.getY();
  //  run();
    return super.onTouchEvent(event);
}
}

以上对我来说很好。

关于java - OnTouch 监听器不会更改位图位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881809/

相关文章:

java - 如何使用 float 从 libGDX 中的单元格获取图 block 的位置?

java - 使用 jsf 准备向导流程

java - 禁用多列选择

java - finally block 完成后抛出 NullPointerException

java - 是否可以在不调用 getContentResolver() 的情况下从 Uri 检索位图?

c# - 使用 Graphics.CopyFromScreen 以 150% 缩放截取屏幕截图

java - 在Java中以最优化的方式比较Oracle的2个表之间的数据

android - 用于加载 HTML5 站点的应用程序容器

java - 安卓服务无法运行

bitmap - 为图像创建一个公共(public)类是否明智?