rectangle in RelativLayout

  • Antworten:14
Volkan Aydin
  • Forum-Beiträge: 187

20.11.2014, 20:22:17 via Website

entweder habe ich verlernt zu googeln, oder google arbeitet gegen mich... :)

Ich möchte eine Liste in einer activity darstellen... und zwar immer text mit bild.

das bild soll dynamisch aus mehreren rechtecken und anderen geometrischen formen entstehen. ich finde aber überall nur anleitungen wie man nur ein rechteck darstellen kann, ist das so weil es nicht anders geht (also Idee wiedermal verwerfen ;) ) oder habt ihr ne lösung... ich dachte das gehe ganz einfach... Meine Idee war mal so......

RelativeLayout mainLayout = (RelativeLayout)findViewById(R.id.mainLayout);

TextView text = new TextView(this);
text.setText("hallo");

mainLayout.addView(text);

Canvas canvas = new Canvas();


Paint paint = new Paint();
paint.setARGB( 1,235, 238, 255);
paint.setStrokeWidth(1);
canvas.drawRect(50, 50, 300, 300, paint);

mainLayout.draw(canvas);

Ich dachte mir schon fast das es nicht so einfach sein kann. Wie immer :(

Antworten
Sven R.
  • Forum-Beiträge: 1.904

21.11.2014, 07:05:16 via App

Ein ganz kurzer Blick hat das ergeben:

drawPath
drawOval
drawRect

Quelle: http://developer.android.com/reference/android/graphics/Canvas.html

Im Internet kannst du auch nach Tutorials zum Canvas suchen.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

21.11.2014, 17:10:24 via Website

Vielen Dank, ich habe dutzende Seiten entdeckt, auch jenste Tutorials, jedoch waren alle auf eine seperate View Klasse angelegt. Ich möchte jedoch dies in der Activity dynamisch laden...
Canvas habe ich ja auch schon entdeckt, wenn du meinen Beitrag zuende gelesen hast.

Ich hoffe ich kann die Antwort so verstehen das es möglich ist. Wenn dies der Fall ist, werd ich mich wieder daran setzten. ansonsten lös ich das ganze per php/pdf......

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.11.2014, 19:21:39 via Website

Müssen die Formen individuell sein?
Sonst könntest du ja auch ein Bild hinerlegen und das reinladen.
Oder geht das nicht?

— geändert am 21.11.2014, 19:21:47

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

21.11.2014, 19:34:16 via Website

Also als beispiel...

Es geht um eine Aluminiumplatte die ausschnitte etc. erhält.

Also ich möchte zuerst den Titel und die Masse darstellen
die nächste Zeile sind die einschnitte und kantenbearbeitung (textlich natürlich)
dann eben die Vorschau.

und dann das nächste Objekt.....

Anhand der Displaybreite wird dann dieses Objekt dargestellt. (inkl. der Proportionen etc....)

Meine Idee ist nun ein Rechteck der Aluminiumplatte darzustellen.
und anhand der Masseingaben der Ausschnitte. z.b. ein rechteck oder kreis werden weitere Rechtecke in diesem Dargestellt.

Dieses rechteck soll anklickbar sein, um danach ein neues Content zu starten, mit detailierten Darstellung, also auch mit Vermassung etc.....

— geändert am 21.11.2014, 19:34:57

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.11.2014, 19:37:29 via Website

Das sollte eigentlich per Canvas möglich sein.
Aber da ich damit noch nie gearbeitet habe, habe ich dementspreched auch keine Ahung davon.

— geändert am 21.11.2014, 19:37:44

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

21.11.2014, 19:40:50 via Website

zum Glück ist ja Wochenende.... :) Das wird wohl wieder ne lange frustrierende Nacht ;)

Antworten
Sven R.
  • Forum-Beiträge: 1.904

21.11.2014, 20:44:34 via App

Ich verstehe dein Problem jetzt nicht. Im Canvas kannst du per drawRect() ein Rechteck zeichnen. Zum Beispiel deine Platte. Per drawOval() kannst du Löcher aufzeichnen.
Und das Drücken auf eine Koordinate kann man mit onTouch() vom Canvas erfahren.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

21.11.2014, 21:03:09 via Website

Es zeigt mir nie was an... ich habe da zwar jetzt etwas gefunden, jedoch immer über eine andere Klasse... mein aktueller versuch sieht so aus:

package com.example.testcenter;

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

public class DrawView extends RelativeLayout {
    Paint paint = new Paint();

    public DrawView(Context context) {
        super(context);            
    }
    @Override
    public void onDraw(Canvas canvas) {
        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(3);
        canvas.drawRect(30, 30, 80, 80, paint);
        paint.setStrokeWidth(0);
        paint.setColor(Color.CYAN);
        canvas.drawRect(33, 60, 77, 77, paint );
        paint.setColor(Color.YELLOW);
        canvas.drawRect(33, 33, 77, 60, paint );

    }
}

und dann möchte ich es hier nach dem Hallo aufrufen

package com.example.testcenter;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class StartActivity extends Activity {
    DrawView drawView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        show();
    }

    public void show(){
        RelativeLayout mainLayout = (RelativeLayout)findViewById(R.id.mainLayout);

        TextView text = new TextView(this);
        text.setText("hallo");
        text.setTextSize(getResources().getDimension(R.dimen.fontSizeListViewTitel));
        mainLayout.addView(text);
        /// BILD

        drawView = new DrawView(this);
        drawView.setBackgroundColor(Color.WHITE);
        mainLayout.addView(drawView);
    }

}

wenn ich

mainLayout.addView(drawView);

passiert nix...

mit

setContentView(drawView);

ladet es das ganze korrekt in einer View....
Wieviele tutorials muss ich noch durchstöbern.... ;)

Antworten
Sven R.
  • Forum-Beiträge: 1.904

21.11.2014, 21:42:31 via App

Ich habe sowas noch nie selbst gemacht, aber es sollte alles korrekt sein.
Mach mal in den Entwickleroptionen Layoutgrenzen an, um zu gucken, ob dein Canvas hinzugefügt wird.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Georg C.
  • Forum-Beiträge: 235

23.11.2014, 01:40:07 via Website

Dein Problem liegt daran, dass du ...... mit Canvas noch nicht so vertraut bist.
Canvas bedeutet eigentlich Leinwand - nun erstmal - als ein Begriff! - nicht als Materie.
Was wir zum zeichnen brauchen ist z.B. ein Blatt Papier, .... Buntstift, ... Fertig.
Mann kann zum Canvas (also als Leinwand) -> ein Blatt Papier, Plakat, Hausfassade ... usw.
nehmen. Lediglich als Pinsel hast du vorgefertigte "Schablone" -> die draw.... Methoden., wie auch die Farben. Um die Farben kümmert sich die Paint. Ist sozusagen deine Farbpalette!

Ich verstehe nicht warum du nicht von einer "Externer" View- Klasse den gebraucht nicht machen möchtest .... ist jedoch dir überlassen!

Um eine Leinwand direkt in der Main- Klasse (Activity) zu implementieren, brauchst du einen "Leinwand Objekt" -> Canvas Objekt -> genauer gesagt ne Instanz der Canvas- klasse.
Und hier (blick in das API / Docku) hast du nur eine Möglichkeit, und zwar das Bitmap.


Canvas()
Construct an empty raster canvas.


Canvas(Bitmap bitmap)
Construct a canvas with the specified bitmap to draw into.

Wenn du also keinen gebrauch, von sehr flexiblen Möglichkeiten, welche -> Exsterne Klassen- Lösungen (bezüglich Canvas) machen möchtest, verbleibt dir nur das Bitmap als Leinwand.

Weitere Versuche / Proben, auf Canvas in der Main- Activity zu Zeichnen -> ist Zeitverschwendung.

Nun dass ist noch nicht alles!
Damit dein Bild auch in deinem RelativeLayout "Container" angezeigt wird, muss das auch dem -> RelativeLayout "Container" mitgeteilt werden; und zwar mit:

mainLayout.setBackgroundDrawable(new BitmapDrawable(bg));
// mainLayout.setBackground(new BitmapDrawable(getResources(), bg));

__________________________________________________ 
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout mainLayout = (RelativeLayout)findViewById(R.id.mainLayout);

        Paint paint = new Paint();
        paint.setColor(Color.GREEN);


        Bitmap bg = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bg); 
        canvas.drawRect(50, 50, 200, 200, paint);

        mainLayout.setBackgroundDrawable(new BitmapDrawable(bg));
        // mainLayout.setBackground(new BitmapDrawable(getResources(), bg));
    }
}
______________________________________________________________

Ansonsten kannst du auf jeden View- Objekt mit Canvas zeichnen.

Ps.
public class DrawView extends RelativeLayout { <----- ???

— geändert am 23.11.2014, 01:52:53

Sorry für Gramatik & Stilistik Fehler.

Antworten
Sven R.
  • Forum-Beiträge: 1.904

23.11.2014, 02:35:45 via App

Georg C.

public class DrawView extends RelativeLayout { <----- ???

Ist mir gar nicht aufgefallen, das könnte unter anderem das Problem sein.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

24.11.2014, 18:42:05 via Website

Sorry das ich erst jetzt reagiere, da ich keine Mail mehr bekommen habe, dachte ich nicht das noch jemand antwortet!, nächste Woche mach ich mich wieder an dieses Thema.. im Moment sind andere "sofort-lösbare" Probleme eben aufgetaucht, deshalb meine AP Abstinenz ;)

Ich habe deinen Code mal überflogen, und versuche zu verstehen.....

mainLayout.setBackgroundDrawable(new BitmapDrawable(bg));
// mainLayout.setBackground(new BitmapDrawable(getResources(), bg));

Intressant finde ich jetzt trotzdem die Hirarchie Canvas ist zwar die Leinwand, weitervererbt wird aber Bitmap...... und zwar als Background??? OK...... naja in einem halben Jahr werd ich hoffentlich über dieses Thema lachen können....

zu public class DrawView extends RelativeLayout ... Hat mich doch erstaunt das sich niemand da gemeldet hat :)...... ich dachte mir ich kapiere nun das mit der Extends blablabla etc...... demnach doch nicht ^^

erstaunlich das das App eigentlich schon fertig ist :)

— geändert am 24.11.2014, 18:42:35

Antworten
Sven R.
  • Forum-Beiträge: 1.904

24.11.2014, 19:49:51 via App

Mit RelativLayout geht das auch irgendwie. Trotzdem brauchst du normalerweise nur die Callbacks und Funktionen eines Canvas. Darum würde normalerweise(kommt auf deinen Verwendungszweck an) einfach nur ein Canvas reichen.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

08.12.2014, 20:34:57 via Website

So... hab endlich wieder zeit gefunden für meine liebe App :)

und siehe da es funktioniert... naja.. ich sags mal so, eigentlich funktioniert es...

kann es sein das "ohne dass das App abstürzt", eine Seite einfach nicht geladen wird....

Folgendes Problem, die rechtecke zeigt es mir immer korrekt (im verhältnis an, aber wenn ich jetzt die masse 200mm breit und 3600 mm hoch darstellen lassen will, zeigt es mir nur das seitenlayout (RelativeLayout) und das LinearLayout wird überhaupt nicht angezeigt.... es zeigt nur beim drüberfahren, das es runterscrollt.....

das selbe ergebniss habe ich auch schon beim Telefonbuch auslesen bemerkt... auch da will es mir einfach nichts anzeigen , es kommt auch vor, das die Buttons auf einmal unbeschriftet sind, und man diese ganz an den rand scrollen muss damit sie auf einer Position doch noch den Text anzeigen?

An was kann das liegen? ich wollte (damit alles sexy aussieht) bei jedem laden einer neuen Activity ein fade in machen mit ......

public AlphaAnimation BoxAnimation(Float startValue,Float EndValue, int StartTime, int EndTime) {
        //0.0F Lowest 1.0F highest
        AlphaAnimation alpha = new AlphaAnimation(startValue, EndValue); // change values as you want
        alpha.setStartOffset(StartTime);
        alpha.setDuration(EndTime); // Make animation instant
        alpha.setFillAfter(true);
        return alpha;
    }   

hattet ihr auch schon solche probleme?

Antworten