Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:onTouchListener不工作_Java_Android_Ontouchlistener - Fatal编程技术网

Java Android:onTouchListener不工作

Java Android:onTouchListener不工作,java,android,ontouchlistener,Java,Android,Ontouchlistener,我不熟悉为Java编写应用程序。我成功地构建了一个小测试应用程序,带有一个在基于线程的循环中不断重新绘制的SurfaceView 现在我设法解决了所有这些图形化的问题,尽管我想实现一个onTouchListener。我按照谷歌告诉我的做了,并将其写入我的主要活动中,实现OnTouchListener并将我的SurfaceView设置为OnTouchListener(直接:Panel.p.setOnTouchListener,间接地:ViewView=findViewById(R.id.Surfa

我不熟悉为Java编写应用程序。我成功地构建了一个小测试应用程序,带有一个在基于线程的循环中不断重新绘制的SurfaceView

现在我设法解决了所有这些图形化的问题,尽管我想实现一个onTouchListener。我按照谷歌告诉我的做了,并将其写入我的主要活动中,实现OnTouchListener并将我的SurfaceView设置为OnTouchListener(直接:
Panel.p.setOnTouchListener
,间接地:View
View=findViewById(R.id.SurfaceView01);View.setOnTouchListener(this);)

但我在两种情况下都没有得到结果。我的应用程序设置为“全屏”,XML仅包含对面板的引用

我不知道其中的错误在哪里,除了监听器,一切都正常。我会在这里添加所有与问题相关的文件,希望有人知道我做错了什么

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >


<com.example.test.Panel android:id="@+id/SurfaceView01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:maxHeight="40dip">
</com.example.test.Panel>
//'Constructor'
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);
    //View view = findViewById(R.id.SurfaceView01);
    //view.setOnTouchListener(this);
    Panel.p.setOnTouchListener(this);
}

//Called when App's being closed
@Override
public void onPause(){
    super.onPause();
    CanvasThread._run = false;
}

//Touching - Somehow doesn't seem to want to do anything :(
@Override
public boolean onTouch (View v, MotionEvent event){
    int x = (int)event.getX();
    int y = (int)event.getY();
    CanvasThread.scene.bird.setDestination(x, y);
    //Pressing
    if(event.getAction()==MotionEvent.ACTION_DOWN){}
    //Releasing
    if(event.getAction()==MotionEvent.ACTION_UP){}
    //Moving
    if(event.getAction()==MotionEvent.ACTION_MOVE){}
    return false;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
CanvasThread canvasthread;
public static Panel p;

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
}


@Override
public void surfaceCreated(SurfaceHolder holder) {
    canvasthread.setRunning(true);
    canvasthread.start();
}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        canvasthread.setRunning(false);
        while (retry) {
                try {
                        canvasthread.join();
                        retry = false;
                } catch (InterruptedException e) {}
        }

}


public Panel(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);
    canvasthread = new CanvasThread(getHolder(), this);
    setFocusable(true);
    p = this;
}


public void onDraw(Canvas canvas, Bitmap img, int x, int y) {
    Paint paint = new Paint();
    canvas.drawBitmap(img, x, y, null);
}

public void setBlack(Canvas canvas){
    canvas.drawColor(Color.BLACK);
}


//-----------Image Management----------------------
public Bitmap chest = BitmapFactory.decodeResource(getResources(), R.drawable.chest);
public Bitmap stairs = BitmapFactory.decodeResource(getResources(), R.drawable.stairs);
public Bitmap[][] blueBird = doubleCrop(BitmapFactory.decodeResource(getResources(), R.drawable.bluebird), 4, 2);
public Bitmap[] tileset = cropIt(BitmapFactory.decodeResource(getResources(), R.drawable.tileset), 10);

public Bitmap[] cropIt(Bitmap set, int length){
    int width = set.getWidth()/length;
    int height = set.getHeight();
    Bitmap[] array = new Bitmap[length];
    for(int c=0; c<length; c++){
        array[c] = Bitmap.createBitmap(set, c*width, 0, width, height);
    }
    return array;
}

public Bitmap[][] doubleCrop(Bitmap set, int yLength, int xLength){
    int width = set.getWidth()/xLength;
    int height = set.getHeight()/yLength;
    Bitmap[][] array = new Bitmap[yLength][xLength];
    for(int cy=0; cy<yLength; cy++){
        for(int cx=0; cx<xLength; cx++){
            array[cy][cx] = Bitmap.createBitmap(set, cx*width, cy*height, width, height);
        }
    }
    return array;
}
    _surfaceHolder = surfaceHolder;
    _panel = panel;
    scene = new Scene(_panel);
}

public void setRunning(boolean run) {
    _run = run;
}

@Override
public void run() {
    Canvas c;
    while (_run) {
        try{Thread.sleep(FRAMEWAIT);}catch(Exception ex){}
        c = null;
        try {
            c = _surfaceHolder.lockCanvas(null);
            synchronized (_surfaceHolder) {
                scene.circle(_panel, c);
            }
        } finally {
            if (c != null) {
                _surfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}
面板(表面视图):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >


<com.example.test.Panel android:id="@+id/SurfaceView01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:maxHeight="40dip">
</com.example.test.Panel>
//'Constructor'
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);
    //View view = findViewById(R.id.SurfaceView01);
    //view.setOnTouchListener(this);
    Panel.p.setOnTouchListener(this);
}

//Called when App's being closed
@Override
public void onPause(){
    super.onPause();
    CanvasThread._run = false;
}

//Touching - Somehow doesn't seem to want to do anything :(
@Override
public boolean onTouch (View v, MotionEvent event){
    int x = (int)event.getX();
    int y = (int)event.getY();
    CanvasThread.scene.bird.setDestination(x, y);
    //Pressing
    if(event.getAction()==MotionEvent.ACTION_DOWN){}
    //Releasing
    if(event.getAction()==MotionEvent.ACTION_UP){}
    //Moving
    if(event.getAction()==MotionEvent.ACTION_MOVE){}
    return false;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
CanvasThread canvasthread;
public static Panel p;

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
}


@Override
public void surfaceCreated(SurfaceHolder holder) {
    canvasthread.setRunning(true);
    canvasthread.start();
}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        canvasthread.setRunning(false);
        while (retry) {
                try {
                        canvasthread.join();
                        retry = false;
                } catch (InterruptedException e) {}
        }

}


public Panel(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);
    canvasthread = new CanvasThread(getHolder(), this);
    setFocusable(true);
    p = this;
}


public void onDraw(Canvas canvas, Bitmap img, int x, int y) {
    Paint paint = new Paint();
    canvas.drawBitmap(img, x, y, null);
}

public void setBlack(Canvas canvas){
    canvas.drawColor(Color.BLACK);
}


//-----------Image Management----------------------
public Bitmap chest = BitmapFactory.decodeResource(getResources(), R.drawable.chest);
public Bitmap stairs = BitmapFactory.decodeResource(getResources(), R.drawable.stairs);
public Bitmap[][] blueBird = doubleCrop(BitmapFactory.decodeResource(getResources(), R.drawable.bluebird), 4, 2);
public Bitmap[] tileset = cropIt(BitmapFactory.decodeResource(getResources(), R.drawable.tileset), 10);

public Bitmap[] cropIt(Bitmap set, int length){
    int width = set.getWidth()/length;
    int height = set.getHeight();
    Bitmap[] array = new Bitmap[length];
    for(int c=0; c<length; c++){
        array[c] = Bitmap.createBitmap(set, c*width, 0, width, height);
    }
    return array;
}

public Bitmap[][] doubleCrop(Bitmap set, int yLength, int xLength){
    int width = set.getWidth()/xLength;
    int height = set.getHeight()/yLength;
    Bitmap[][] array = new Bitmap[yLength][xLength];
    for(int cy=0; cy<yLength; cy++){
        for(int cx=0; cx<xLength; cx++){
            array[cy][cx] = Bitmap.createBitmap(set, cx*width, cy*height, width, height);
        }
    }
    return array;
}
    _surfaceHolder = surfaceHolder;
    _panel = panel;
    scene = new Scene(_panel);
}

public void setRunning(boolean run) {
    _run = run;
}

@Override
public void run() {
    Canvas c;
    while (_run) {
        try{Thread.sleep(FRAMEWAIT);}catch(Exception ex){}
        c = null;
        try {
            c = _surfaceHolder.lockCanvas(null);
            synchronized (_surfaceHolder) {
                scene.circle(_panel, c);
            }
        } finally {
            if (c != null) {
                _surfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}
非常感谢你的建议


非常感谢。

您可以直接在面板的构造函数中声明onTouchListener:

public class Panel extends SurfaceView{
      Panel(final Context context, AttributeSet attrs){

          setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                //put your logics here
            }
          }   
      }
}
我还认为,由于CanvaThread只关心面板上的图形,所以除了面板之外,其他任何人都不应该知道CanvaThread

顺便说一下:在您的示例中,您只需要将
returnfalse
设置为
returntrue
到Activity的onTouch方法中。我认为应该解决这个问题

@Override
public boolean onTouch (View v, MotionEvent event){
    //....
    return true; //not false
}

嘿,谢谢你的快速回答:)我试着按照你说的做了:我把setOnTouchListener直接放在Panel的构造函数中,但它什么也没做(我把代码直接放在你标记为“Logics here”的行中,这样无论调用什么,它都能工作)。我试着在我的原始代码和根据您所说的编辑的代码中设置返回值为true和false,同样的事情:什么都没发生……在您的代码中,我没有看到您以编程方式设置面板高度和宽度的部分。在XML面板中,高度和宽度是“包裹内容”,所以面板的宽度和高度可能会收缩为零。你看到你的面板了吗?如果否-尝试添加
android:backgraound=“#f00”
参数以查看面板区域。例如,尝试将面板的宽度和高度设置为100dp。如果这不起作用,请尝试(暂时)删除停止线程的代码。我的意思是
canvathread.\u run=false部分。好的,现在可以了,在您输入之前我更改的Bird类有一个问题。现在它与您给我的代码完美结合,谢谢您:顺便问一下。有没有办法获得类似System.out.println()的东西,可以在Android上进行调试?您很好:)有“LogCat”视图(在eclipse:window-->show view->other->Android->LogCat中)。当您调用Log.X(“tag”、“message”)方法时,消息将显示在“LogCat”视图中。哦,我忘了,你可以直接使用
System.out.println(message)
。消息也将显示在LogCat中