Zoomlayout: Comment dessiner une vue personnalisée dans ZoomLayout

Créé le 28 sept. 2020  ·  5Commentaires  ·  Source: natario1/ZoomLayout

Comment puis-je?

Comment puis-je dessiner ma vue personnalisée qui peut devenir zoomable avec l'utilisation de cette bibliothèque

package com.example.mindmapping;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.otaliastudios.zoom.ZoomLayout;

public class MainActivity extends AppCompatActivity {

    <strong i="7">@Override</strong>
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        MindMap map = new MindMap(this);

        setContentView(R.layout.activity_main);
        ZoomLayout zoomLayout = findViewById(R.id.zoomLayoutContainer);
        zoomLayout.addView(map);
        setContentView(map);

    }
}

Où la carte est une vue personnalisée, étend la méthode View & Overrides onDraw, elle contient d'autres éléments tels que TextElement & Other qui sont également des vues personnalisées ou s'étendent à partir d'une mise en page linéaire et contiennent une vue de texte : comme ceci

package com.example.mindmapping;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
import android.widget.Toast;

public class MindMap extends View {

    private Context context;
    private Canvas canvas;
    private Paint brush;

    //Canvas Variables
    private float centerMarginX;
    private float centerMarginY;
    private float mWidth;
    private float mHeight;

    public MindMap(Context context) {
        super(context);
        this.context = context;

        initSetup();
    }

    <strong i="11">@Override</strong>
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        this.canvas = canvas;

        initDrawing();
    }

    public void initSetup() {
        brush = new Paint(Paint.ANTI_ALIAS_FLAG);
    }

    public void initDrawing() {

        brush.setStyle(Paint.Style.STROKE);
        brush.setStrokeWidth(10);
        brush.setColor(Color.parseColor("black"));
        canvas.drawText("Helo ",50,50,brush);

        mWidth = getMeasuredWidth();
        mHeight = getMeasuredHeight();

        centerMarginX = mWidth / 2;
        centerMarginY = mHeight / 2;

        TextElement textElement = new TextElement(context, "Main Topic");
        textElement.setX(centerMarginX - (textElement.getLayoutWidth() / 2));
        textElement.setY(centerMarginY - (textElement.getLayoutHeight() / 2));
        textElement.draw(canvas);

        TextElement textElement1 = new TextElement(context, "Another One");
        textElement1.setX(textElement.getX() + textElement.getLayoutWidth() + 600);
        textElement1.setY(textElement.getY() - textElement.getLayoutHeight());
        textElement1.draw(canvas);

        Toast.makeText(this.context,"Drawn",Toast.LENGTH_SHORT).show();
    }
}

La vue personnalisée (la carte dans ce cas) n'est pas dessinée dans le ZoomLayout même si la méthode onDraw est appelée, mais lorsque je définis la carte dans setContentView au lieu du fichier de mise en page et que je n'utilise pas ZoomLayout, la carte est dessinée sur le canevas, je veux pour dessiner ma vue personnalisée qui devrait être zoomable avec cette bibliothèque

Version utilisée

1.8.0

question

Commentaire le plus utile

Merci !

J'avais besoin d'appeler setMeasuredDimension dans onMeasure surchargé, car il s'agit d'une vue entièrement personnalisée, docs!

Mon problème a été résolu.

Tous les 5 commentaires

Rien n'est dessiné sur le canevas, pas même ce texte helo, dessiné dans initDrawing()

que setContentView a été appelé à nouveau pour définir la carte comme une vue en tant que test, c'était un commentaire, le supprimer ne résout pas le problème

whatever

Votre vue personnalisée peut être dessinée avec une taille 0. Essayez de déboguer votre mise en page, soit en utilisant les paramètres du développeur sur l'appareil/l'émulateur, soit via l'inspecteur de mise en page d'Android Studio.

Merci !

J'avais besoin d'appeler setMeasuredDimension dans onMeasure surchargé, car il s'agit d'une vue entièrement personnalisée, docs!

Mon problème a été résolu.

Cette page vous a été utile?
5 / 5 - 1 notes