canvas.drawline没有绘图

时间:2016-07-06 20:26:55

标签: android bitmap android-canvas

我正在使用Mario Zechner和Robert Green撰写的(伟大的)书籍 Beginning Android Games 中描述的框架。到目前为止,一切都很顺利,我可以利用框架为主菜单绘制我的位图。通过该框架,我也能够清除背景,这也很有效。但是,当涉及到绘制像素,线条或形状时,我完全被卡住,因为它们没有被绘制。这些方法的执行方式与两种工作方法的方式类似,我的日志调试告诉我它们确实执行了,但屏幕上没有新的内容。

一个源(canvas.drawLine() not appearing on bitmap)表示要绘制到位图然后将位图绘制到画布上,但我已经确保这样做了。我的油漆也不是空的。绘制矩形时,我确保其高度和宽度大于0.绘制线条时,我尝试将宽度设置为10并填充STROKE。然而,所有这一切都是徒劳的。

以下是图形类的代码

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;

import com.learnplex.framework.Graphics;
import com.learnplex.framework.Pixmap;

import java.io.IOException;
import java.io.InputStream;

public class AndroidGraphics implements Graphics {
    AssetManager assets;
    Bitmap frameBuffer;
    Canvas canvas;
    Paint paint;
    Rect srcRect = new Rect();
    Rect dstRect = new Rect();

    public AndroidGraphics(AssetManager assets, Bitmap frameBuffer) {
        this.assets = assets;
        this.frameBuffer = frameBuffer;
        this.canvas = new Canvas(frameBuffer);
        this.paint = new Paint();
    }

    public Pixmap newPixmap(String fileName, PixmapFormat format) {
        Config config = null;
        if (format == PixmapFormat.RGB565)
            config = Config.RGB_565;
        else if (format == PixmapFormat.ARGB4444)
            config = Config.ARGB_4444;
        else
            config = Config.ARGB_8888;

        Options options = new Options();
        options.inPreferredConfig = config;

        InputStream in = null;
        Bitmap bitmap = null;
        try {
            in = assets.open(fileName);
            bitmap = BitmapFactory.decodeStream(in);
            if (bitmap == null)
                throw new RuntimeException("Couldn't load bitmap from asset '"
                        + fileName + "'");
        } catch (IOException e) {
            throw new RuntimeException("Couldn't load bitmap from asset '"
                    + fileName + "'");
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
        }

        if (bitmap.getConfig() == Config.RGB_565)
            format = PixmapFormat.RGB565;
        else if (bitmap.getConfig() == Config.ARGB_4444)
            format = PixmapFormat.ARGB4444;
        else
            format = PixmapFormat.ARGB8888;

        return new AndroidPixmap(bitmap, format);
    }

    public void clear(int color) {
        canvas.drawRGB((color & 0xff0000) >> 16, (color & 0xff00) >> 8,
                (color & 0xff));
    }

    public void drawPixel(int x, int y, int color) {
        paint.setColor(color);
        canvas.drawPoint(x, y, paint);
    }

    public void drawLine(int x, int y, int x2, int y2, int color) {
        paint.setColor(color);
        canvas.drawLine(x, y, x2, y2, paint);
    }

    public void drawRect(int x, int y, int width, int height, int color) {
        paint.setColor(color);
        paint.setStyle(Style.FILL);
        canvas.drawRect(x, y, x + width - 1, y + width - 1, paint);
    }

    public void drawArc(int x, int y, int width, int height, int startAngle, int sweepAngle, int color) {
        paint.setColor(color);
        RectF oval = new RectF(x, y, x + width - 1, y + height -1);
        canvas.drawArc(oval, startAngle, sweepAngle, true, paint); // true is usecenter, idk what it does yet
    }

    public void drawPixmap(Pixmap pixmap, int x, int y, int srcX, int srcY,
                           int srcWidth, int srcHeight) {
        srcRect.left = srcX;
        srcRect.top = srcY;
        srcRect.right = srcX + srcWidth - 1;
        srcRect.bottom = srcY + srcHeight - 1;

        dstRect.left = x;
        dstRect.top = y;
        dstRect.right = x + srcWidth - 1;
        dstRect.bottom = y + srcHeight - 1;

        canvas.drawBitmap(((AndroidPixmap) pixmap).bitmap, srcRect, dstRect, null);
    }

    public void drawPixmap(Pixmap pixmap, int x, int y) {
        canvas.drawBitmap(((AndroidPixmap)pixmap).bitmap, x, y, null);
    }

    public int getWidth() {
        return frameBuffer.getWidth();
    }

    public int getHeight() {
        return frameBuffer.getHeight();
    }
}

正如我所说,drawPixmap类以及clear class

都可以

以下是实施的相关部分

 public void present(float deltaTime){
        Graphics g = game.getGraphics(); 

        g.clear(0xffffff); //From here down works - clears background and makes white
        g.drawPixmap(Assets.getTitle(), 240, 20 ); // Display title
        g.drawPixmap(Assets.getStart(), 540, 300); // Display start button
        g.drawPixmap(Assets.getScore(), 590, 550); // Display score button / connect with google play
        g.drawPixmap(Assets.getThemeScreen(),740, 550); // Display theme screen
        if(Settings.soundEnabled)                        // Display sound icon
            g.drawPixmap(Assets.getSoundOn(), 440, 550);
        else
            g.drawPixmap(Assets.getSoundOff(), 440, 550);

        g.drawLine(100, 200, 300, 400, 0x000000); //This does not work - draws black line
    }

0 个答案:

没有答案