OnTouch监听不改变位置的位图 [英] OnTouch Listener doesn't change bitmap location
本文介绍了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屋!
查看全文