[JAVA] Zeigen Sie Text zeichenweise in der Oberflächenansicht auf Android an

Vorstellen

Hallo, das ist Hokkaido von Studenten. Grundsätzlich habe ich ein wenig Entwicklungserfahrung mit Android und die Sprachen, die ich verwenden kann, sind Java und C #. Vielen Dank. Als ich versuchte, so etwas wie RPG auf Android zu erstellen, blieb ich bei der Methode stecken, Text Zeichen für Zeichen in SurfaceView anzuzeigen, also werde ich es schreiben, damit ich es nicht vergesse. Ich denke, es gibt viele Fehler, aber bitte vergib mir.

Was ist Oberflächenansicht?

――Ideal für Dinge, die Zeichnungsleistung erfordern, wie Animationen und Spiele, komplizierte Grafiken und Zeichnungsinhalte, die ständig aktualisiert werden.

Code

Erstellen Sie eine Klasse für Grafiken und fügen Sie Zeichenanweisungen ein.

Graphics.java



    //Konstrukteur
    public Graphics(int w, int h, SurfaceHolder holder) {
        this.holder = holder;
        this.holder.setFormat(PixelFormat.RGBA_8888);
        this.holder.setFixedSize(w, h);
        paint = new Paint();
        paint.setAntiAlias(true);
    }

    public Canvas getCanvas() {
        return canvas;
    }

    //Sperren
    public void lock() {
        canvas = holder.lockCanvas();
        if (canvas == null) return;
        canvas.translate(originX, originY);
    }

    //Freischalten
    public void unlock() {
        if (canvas == null) return;
        holder.unlockCanvasAndPost(canvas);
    }

    //Angabe des Zeichnungsursprungs
    public void setOrigin(int x, int y) {
        originX = x;
        originY = y;
    }

    //Holen Sie sich die X-Koordinate des Zeichnungsursprungs
    public int getOriginX() {
        return originX;
    }

    //Ermitteln Sie die Y-Koordinate des Zeichnungsursprungs
    public int getOriginY() {
        return originY;
    }

    //Farbspezifikation
    public void setColor(int color) {
        paint.setColor(color);
    }

    //Geben Sie die Schriftgröße an
    public void setTextSize(int fontSize) {
        paint.setTextSize(fontSize);
    }

    //Holen Sie sich Schriftmetriken
    public Paint.FontMetrics getFontMetrics() {
        return paint.getFontMetrics();
    }

    //Zeichenbreite abrufen
    public int measureText(String string) {
        return (int)paint.measureText(string);
    }

    //Zeichnen eines gefüllten Rechtecks
    public void fillRect(int x, int y, int w, int h) {
        if (canvas == null) return;
        paint.setStyle(Paint.Style.FILL);
        canvas.drawRect(new Rect(x, y, x+w, y+h), paint);
    }

    //Bitmap-Zeichnung
    public void drawBitmap(Bitmap bitmap, int x, int y) {
        if (canvas == null) return;
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Rect src = new Rect(0, 0, w, h);
        Rect dst = new Rect(x, y, x+w, y+h);
        canvas.drawBitmap(bitmap, src, dst, null);
    }

    //Bitmap-Zeichnung
    public void drawBitmap(Bitmap bitmap, Rect src, Rect dst) {
        if (canvas == null) return;
        canvas.drawBitmap(bitmap, src, dst, null);
    }

    //Zeichne eine Schnur
    public void drawText(String string, int x, int y) {
        if (canvas == null) return;
        canvas.drawText(string, x, y, paint);
    }

Erstellen Sie dann eine Klasse, die SurfaceView erbt, und legen Sie sie in Aktivität fest. (Es wird etwas länger dauern)

IndexActivity.java



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new RPGView(this, storyNum));
    }

RPGView.java




    
    public RPGView(Activity activity, int story) {
        super(activity);
        holder = getHolder();
        holder.addCallback(this);

        //Grafikgenerierung
        g = new Graphics(dw, H, holder);
        g.setOrigin((dw - W) / 2, 0);
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        thread = null;
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run() {
        while (thread != null) {

            //Programmieren Sie hier den Hauptschleifen-Zeichenprozess

            //schlafen
            key = KEY_NONE;
            sleep(200);
        }
    }

Danach schreibe ich den Zeichenvorgang in die Hauptschleife des Threads. (Was machst du?)

Text ein Zeichen nach dem anderen ...

Die Ansicht wird jedes Mal im SurfaceView-Thread aktualisiert, daher habe ich die Zeichenfolge zeichenweise hinzugefügt und es hat funktioniert.

RPGView.java



     //Zeichnen des Dialogbildschirms
    private void talk(String message, Bitmap bitmap, String who) {
        int color = Color.rgb(0, 0, 0);
        if (bitmap != null) {
            g.lock();
            g.setColor(color);
            g.fillRect(0, 0, W, H);

            g.getCanvas().translate(0, 0);
            g.fillRect(0, 0, realX, realY);
            g.getCanvas().translate((dspW - W) / 2, 0);

            g.drawBitmap(bitmap, 0, 0);
            g.setColor(Color.rgb(255, 255, 255));
            g.fillRect((W - 504) / 2, H - 122, 504, 104);
            g.setColor(color);
            g.fillRect((W - 500) / 2, H - 120, 500, 100);

            //Brechen Sie die Linie des TODO-Charakters! !! !! !!
            g.setColor(Color.rgb(255, 255, 255));
            g.setTextSize(25);
            if (message.length() > 18) {
                String message1 = message.substring(0, 18);
                String message2 = message.substring(18);
                g.drawText(message1, (W - 500) / 2 + 25, 370 - (int) g.getFontMetrics().top);
                g.drawText(message2, (W - 500) / 2 + 10, 410 - (int) g.getFontMetrics().top);
            } else {
                g.drawText(message,
                        (W - 500) / 2 + 25, 370 - (int) g.getFontMetrics().top);
            }

            g.unlock();
        }
    }

Wenn Sie diese Methode aus der Schleife aufrufen und den Text mit einem weiteren Zeichen übergeben ...

RPGView.java



    String text = "AIUEO";
    if (moji_count == text.length() || moji_count == 9999) {
          talk(text, background, null);
          moji_count = 9999;
    } else {
          talk(text.substring(0, moji_count), background, null);
          moji_count++;
    }     

Ich konnte es Charakter für Charakter tun. Sie können es mit genau der richtigen Geschwindigkeit anzeigen, indem Sie es für kurze Zeit in den Ruhezustand versetzen.

Referenz

Recommended Posts

Zeigen Sie Text zeichenweise in der Oberflächenansicht auf Android an
Zeichenfolgen zeichenweise anzeigen [Hinweis]
Quelle zur Anzeige des Zeichenarrays mit numberPicker in Android Studio (Java)
Android-Ansicht
Ansicht über anderen Apps auf Android anzeigen (Zusammenfassung der Unterstützungsmethoden nach API-Version)
Text als ASCII-Grafik in Java anzeigen (jfiglet)
[Japanische Lokalisierung] i18n-Schienen Nur einfache Anzeige der japanischen Lokalisierungsansicht
[Schienen] So zeigen Sie Bilder in der Ansicht an