微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android studios上用于Java中Pathfinder的DrawSurface

如何解决android studios上用于Java中Pathfinder的DrawSurface

我正在为Android Studios上的Pathfinding编写代码,正在使用一个名为DrawSurface的View类。此类是Activity_main.xml中使用的类。我对如何生成单元格感到困惑,并且在onTouch方法上也遇到了麻烦。我有两个图像,一个是起点,另一个是终点。使用此onTouch,我必须能够将起点放置在任何单元格中,然后将终点放置在任何单元格中。一旦发生这种情况,A *代码生成一条最便宜的路径。然后能够触摸任何其他不同的单元格,这将清除单元格(除了新的起点),然后过程重新开始。下面是我的DrawSurfce类,其中包含所有loadNewMap及其代码,这些代码用于创建单元格集,开始单元格集阻止程序并计算屏幕上单元格的数量并连接单元格。也不确定我的onDraw是否正确。现在,如果我运行该程序,它将是一个白色屏幕,底部带有一个贷记按钮,并且我可以触摸该屏幕,但它只会将起点放在屏幕上。

DarwSurface

package edu.fullsail.mgems.cse.pather.allisonhix;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import java.util.ArrayList;

public class DrawSurface extends SurfaceView implements SurfaceHolder.Callback,View.OnTouchListener {

protected Bitmap mBMPStart = BitmapFactory.decodeResource(getResources(),R.drawable.start);
protected Bitmap mBMPEnd = BitmapFactory.decodeResource(getResources(),R.id.end);
protected ArrayList<PointF> mCellStart;
protected ArrayList<PointF> mCellEnd;
protected ArrayList<NavCell> mNavCell;

private int mCellCols;
private int mCellRows;
Rect mScreenDim = new Rect();
public NavCell[][] mCells;
static float CELL_SIZE = 64;
private SurfaceHolder mHolder;
private Object Canvas;
private Object PointF;
private Canvas canvas;


public DrawSurface(Context context,AttributeSet attrs) {
    super(context,attrs);
    init();
}

public void init() {
    getHolder().addCallback(this);
    setonTouchListener(this);
    mBMPEnd = BitmapFactory.decodeResource(getResources(),R.drawable.end);
    mBMPStart = BitmapFactory.decodeResource(getResources(),R.drawable.start);
    setwillNotDraw(false);
    mCellStart = new ArrayList<>();
    mCellEnd = new ArrayList<>();
    View viewById = findViewById(R.id.dsField);
}

@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
    mHolder = surfaceHolder;
    Canvas c = mHolder.lockCanvas();
    if (c != null) mScreenDim.set(0,c.getWidth(),c.getHeight());

    mHolder.unlockCanvasAndPost(c);

    loadNewMap();
    invalidate();
}

public void loadNewMap() {

    //calculate number of cells based on screen
    for (int i = 0; i < mCellCols; i++) {
        for (int j = 0; j < mCellRows; j++) {
            mCellCols = (int) Math.ceil((float) mScreenDim.width() / (float) CELL_SIZE);
            mCellRows = (int) Math.ceil((float) mScreenDim.height() / (float) CELL_SIZE);
        }
    }
    // create cells
    mCells = new NavCell[mCellRows][mCellCols];
    for (int j = 0; j < mCellRows; j++) {
        for (int i = 0; i < mCellCols; i++) {
            mCells[j][i] = new NavCell(i,j);
            mCells[j][i].setBounds(
                    i * CELL_SIZE,j * CELL_SIZE,(i * CELL_SIZE) + CELL_SIZE,(j * CELL_SIZE) + CELL_SIZE);
        }
    }
    // set start cell
    mCellStart = mCells[mCellRows / 4][mCellCols / 2];
    mCellEnd = null;
    //set blockers
    int midRow = mCellRows / 2;
    {
        for (int j = 0; j < mCellRows; j++) {
            for (int i = 0; i < mCellCols; i++) {
                if (j == midRow && i > 0 && i < mCellCols - 1)
                    mCells[j][i].setImpassable();
            }
        }
    }
    // connect cells
    for (int j = 0; j < mCellRows; j++) {
        for (int i = 0; i < mCellCols; i++) {
            if (i > 0 && mCells[j][i - 1].isPassable())
                mCells[j][i].setNeighbor(0,mCells[j][i - 1]);
            if (j > 0 && mCells[j - 1][i].isPassable())
                mCells[j][i].setNeighbor(1,mCells[j - 1][i]);
            if (i < mCellCols - 1 && mCells[j][i + 1].isPassable())
                mCells[j][i].setNeighbor(2,mCells[j][i + 1]);
            if (j < mCellRows - 1 && mCells[j + 1][i].isPassable())
                mCells[j][i].setNeighbor(3,mCells[j + 1][i]);
        }
    }
}

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mCellEnd != null) {
        for (PointF end : mCellEnd) {
            canvas.drawBitmap(mBMPEnd,new Rect(0,mBMPEnd.getWidth(),mBMPEnd.getHeight()),new RectF(end.x - mBMPEnd.getWidth() / 2,end.y - mBMPEnd.getHeight() / 2,end.x + mBMPEnd.getWidth() / 2,end.y + mBMPEnd.getHeight() / 2),new Paint());
        }
        if (mBMPStart != null) {
            for (PointF start : mCellStart) {
                canvas.drawBitmap(mBMPStart,mBMPStart.getWidth(),mBMPStart.getHeight()),new RectF(start.x - mBMPStart.getWidth() / 2,start.y - mBMPStart.getHeight() / 2,start.x + mBMPStart.getWidth() / 2,start.y + mBMPStart.getHeight() / 2),new Paint());
            }
        }

    }
}

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

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

public boolean onTouch(android.view.View v,MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        PointF start = new PointF(event.getX(),event.getY());
        mCellStart.add(start);
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            PointF end = new PointF(event.getX(),event.getY());
            mCellEnd.add(end);
        }
        invalidate();
    }
    return true;
}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。