ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – OnTouch Listener不会更改位图位置

2019-10-08 13:04:43  阅读:134  来源: 互联网

标签:android java bitmap


我有一个“Board.java”类,它是一个活动,还有一个“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);
}
}

以上工作对我来说很好.

标签:android,java,bitmap
来源: https://codeday.me/bug/20191008/1871919.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有