OnTouch监听不改变位置的位图 [英] OnTouch Listener doesn't change bitmap location

查看:304
本文介绍了OnTouch监听不改变位置的位图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Board.java类,它是一个活动,和一个MySurfaceView.java,这是一个SurfaceView。我借鉴了一些SurfaceView位图,我想移动它时,屏幕被触摸(到触摸的地方)。它绘制的位图,但接触后,什么都没有发生。结果
提前致谢!

日志:

 取消事件,由于没有窗户重点:MotionEvent {行动= ACTION_CANCEL,actionButton = 0,ID [0] = 0,X [0] = 539.47266,Y [0] = 978.45703 ,Tooltype刀具[0] = TOOL_TYPE_FINGER,buttonState = 0,亚状态= 0,标志=为0x0,edgeFlags =为0x0,pointerCount = 1,historySize = 0,EVENTTIME = 90656,停工= 88761,DEVICEID = 0,源= 0x1002}

Board.java:

 包com.myfirstapplication.owner.appversion1;进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.os.Bundle;
进口android.support.v7.app.AppCompatActivity;
进口android.view.MotionEvent;
进口android.view.View;
进口android.widget.ImageView;
进口android.widget.RelativeLayout;
进口android.widget.TextView;/ **
 *创建者所有者的15/06/2016。
 * /公共类板扩展AppCompatActivity实现View.OnTouchListener {
    TextView的电视;
    MySurfaceView MV;
    位图基点;
    浮动的x,y;    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        MV =新MySurfaceView(本);
        mv.setOnTouchListener(本);
        BP = BitmapFactory.de codeResource(getResources(),R.drawable.missile_cartoon);
        X = 0;
        Y = 0;
        的setContentView(MV);    }    @覆盖
    保护无效的onPause(){
        super.onPause();
        mv.pause();
    }    @覆盖
    保护无效onResume(){
        super.onResume();
        mv.resume();
    }
    @覆盖
    公共布尔onTouch(视图V,MotionEvent事件){
        尝试{
            视频下载(50);
        }赶上(InterruptedException的E){
            e.printStackTrace();
        }        X = event.getX();
        Y = event.getY();        返回true;
    }   }

MySurfaceView.java:

 包com.myfirstapplication.owner.appversion1;进口android.content.Context;
进口android.graphics.Bitmap;
进口android.graphics.BitmapFactory;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.graphics.Paint;
进口android.graphics.Path;
进口android.graphics.Rect;
进口android.util.AttributeSet;
进口android.view.MotionEvent;
进口android.view.SurfaceHolder;
进口android.view.SurfaceView;
进口android.view.View;
进口android.widget.ImageView;/ **
 *创建者所有者的16/06/2016。
 * /
公共类MySurfaceView扩展SurfaceView实现Runnable {
    浮动的x,y;
    位图基点;
    线程t = NULL;
    SurfaceHolder持有人;
    布尔isItOK = FALSE;
    公共MySurfaceView(上下文的背景下){
        超级(上下文);
        位图bpOld = BitmapFactory.de codeResource(getResources(),R.drawable.missile_cartoon);
        BP = Bitmap.createScaledBitmap(bpOld,250,250,TRUE);
        X = 0;
        Y = 0;
        支架= getHolder();
    }
    @覆盖
    公共无效的run(){
        而(isItOK){
            如果(!holder.getSurface()。isValid()的)
                继续;
            帆布C = holder.lockCanvas();
            c.drawARGB(255,150,150,10);
            c.drawBitmap(bp的,X-(bp.getWidth()/ 2),y轴(bp.getHeight()/ 2),空);
            holder.unlockCanvasAndPost(C);
        }
    }    公共无效暂停(){
        isItOK = FALSE;
        而(真){
            尝试{
                t.join();
            }
            赶上(InterruptedException的E){
                e.printStackTrace();
            }
            打破;
        }
        T = NULL;
    }    公共无效简历(){
        isItOK = TRUE;
        T =新的Thread(本);
        t.start();
    }}


解决方案

删除TouchListener在董事会

局:

 公共类扩展板{AppCompatActivityMySurfaceView MV;
位图基点;保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    MV =新MySurfaceView(本);
    BP = BitmapFactory.de codeResource(getResources(),R.mipmap.ic_launcher);
    的setContentView(MV);}@覆盖
保护无效的onPause(){
    super.onPause();
    mv.pause();
}@覆盖
保护无效onResume(){
    super.onResume();
    mv.resume();
}
}

和在MySurfaceView

 公共类MySurfaceView扩展SurfaceView实现Runnable {
浮动的x,y;
位图基点;
线程t = NULL;
SurfaceHolder持有人;
布尔isItOK = FALSE;
公共MySurfaceView(上下文的背景下){
    超级(上下文);
    位图bpOld = BitmapFactory.de codeResource(getResources(),R.mipmap.ic_launcher);
    BP = Bitmap.createScaledBitmap(bpOld,250,250,TRUE);
    X = 0;
    Y = 0;
    支架= getHolder();
}
@覆盖
公共无效的run(){
    而(isItOK){
        如果(!holder.getSurface()。isValid()的)
            继续;
        帆布C = holder.lockCanvas();
        c.drawARGB(255,150,150,10);        c.drawBitmap(bp的,X-(bp.getWidth()/ 2),y轴(bp.getHeight()/ 2),空);
        holder.unlockCanvasAndPost(C);
    }
}公共无效暂停(){
    isItOK = FALSE;
    而(真){
        尝试{
            t.join();
        }
        赶上(InterruptedException的E){
            e.printStackTrace();
        }
        打破;
    }
    T = NULL;
}公共无效简历(){
    isItOK = TRUE;
    T =新的Thread(本);
    t.start();
}@覆盖
公共布尔onTouchEvent(MotionEvent事件){
    X = event.getX();
    Y = event.getY();
  // 跑();
    返回super.onTouchEvent(事件);
}
}

以上工作对我罚款。

I have a "Board.java" class, which is an activity, and a "MySurfaceView.java", which is a SurfaceView. I'm drawing some bitmap on the SurfaceView and I want to move it when the screen is touched (to the touched place). it draws the bitmap but after touching, nothing happened.
Thanks in advance!

Log:

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



}

解决方案

Remove TouchListener in Board

Board:

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

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

Above work fine for me.

这篇关于OnTouch监听不改变位置的位图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆