Kreis zeichnen Radius ändern

  • 14 Antworten
  • Letztes Antwortdatum
M

Martin2013

Neues Mitglied
0
Hi,
ich will einen Kreis zeichnen und dessen Radius ich mit einer Seekbar ändern kann.

Zuerst Hab ich mal die SeekBar eingebaut und wollte erstmal den eingestellten Wert in einer TextView ausgben. Kann mir wer sagen warum der Wert nicht angezeigt wird ?

Code:
public class Kreis extends Activity implements OnSeekBarChangeListener{

    SeekBar seekbar;
    int radius;
    TextView textview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_kreis);
        
        seekbar = (SeekBar)findViewById(R.id.radiusbar);
        textview = (TextView)findViewById(R.id.ausgabe);
        

        
    }
    


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.kreis, menu);
        return true;
    }


    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        radius = seekbar.getProgress();
        textview.setText(radius+""); 
    }


    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        
    }


    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        
    }

}

2. Frage, wie zeichnet man einen Kreis in Android ? und ist es möglich dann den Radius so fließend zu ändern ?



Danke!
 
Du setzt den Listener nirgendwo auf die Seekbar.
Deswegen weiß die Seekbar nicht was sie tun soll wenn "hr progresswert sich ändert.

seekbar.setOnProgressChangedListener() oder so ähnlich müsste das sein.
 
Danke, ja hat funktioniert.

Zu meinem Kreis, ich habe jetz erfolgreich einen Kreis gezeichnet, nun will ich den Radius eben mit dem Seekbar ändern. Problem, wie kann ich jetz die Variable Klassenübergreifend nutzen, irgendwie scheint die Variable radius immer 0 zu sein, obwohl mein TextView sehr wohl immer den aktuell eingestellten Wert der Seekbar anzeigt.

Meine Activity:
Code:
public class Kreis extends Activity implements OnSeekBarChangeListener  {
        private SeekBar seekbar;
        public static int radius;
        private TextView textview;
        
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_kreis);
            this.seekbar = (SeekBar)findViewById(R.id.radiusbar);
            this.textview = (TextView)findViewById(R.id.ausgabe);
            seekbar.setOnSeekBarChangeListener(this);
            final Circle view = new Circle(this);
            
            ViewGroup.LayoutParams params = 
                                new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT,
                                                           LayoutParams.FILL_PARENT);
            addContentView(view, params);
           
            
        }

        
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        radius = seekbar.getProgress();
        textview.setText(radius + "");
        
    }



    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        
    }



    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        
    }

    public class Circle extends View{
        
            
            public Circle(Context context) {
                super(context);
                
            }
            @Override
            public void draw(Canvas canvas) {
                
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);

                canvas.drawCircle(70,30,radius,paint);
                
            }
            

        }

}
 
Zuletzt bearbeitet:
Das Problem ist, dass du den Kreis malst.
Und erst viel später überhaupt radius setzt.

Du müsstest jedesmal wenn onProgressChange aufgerufen wird erst den vorhandenen kreis löschen (also die View löschen) und dann mit addContentView wieder neu hinzufügen.

DU fügst den Kreis aktuell ja hinzu bevor radius zum ersten mal überhaupt einen Wert bekommt und dieser Kreis ist dann da und wird nie wieder verändert.

Genauso wie du die textview ja auch auch erst danach setzt.

Du kannst einen einmal gezeichneten Kreis nicht mehr ändern, sondern musst den jedes mal neu zeichnen.
 
Erstmal danke für deine Antwort.
Das dachte ich mir schon das er dein Kreis nur einmal zeichnet. Ich hab jetz aber absolut keine Ahnung wie man den Kreis löscht. Und wie soll ich das alles inder Methode onProgressChanged machen ?
 
Ich habs mittlerweile hinbekommen, kA obs eine bessere Methode gibt als meine aber sie funktioniert.

Code:
    public class Kreis extends Activity  implements OnSeekBarChangeListener    {
        private SeekBar seekbar;
        public static int radius = 30;
        private TextView textview;
        
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_kreis);
            this.seekbar = (SeekBar)findViewById(R.id.radiusbar);
            this.textview = (TextView)findViewById(R.id.ausgabe);
            seekbar.setOnSeekBarChangeListener(this);

            
            
        }

        
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        radius = seekbar.getProgress();
        textview.setText(radius + "");

        Circle view = new Circle(this);
        RelativeLayout.LayoutParams params = 
                new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
                                           LayoutParams.FILL_PARENT);
       addContentView(view,params);
    }



    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        
    }



    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        
    }

    public class Circle extends View{
        
            
            public Circle(Context context) {
                super(context);
                
            }
            @Override
            public void draw(Canvas canvas) {
                
                
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);
                
                if(radius>0){
                canvas.drawCircle(400,500,radius,paint);
                }
                
            }
            

        }







}


Nun noch eine Frage, bei der x y Achse vom Kreis, also die Position kann ich immer nur Raten. Ich will aber das der Kreis genau in der Mitte des Bildschirms liegt. Wie finde ich die Koordinaten der Mitte heraus ? Und das wird ja von der Bildschirmauflösung abhängig sein oder ?
 
Kann sich vielleicht jmd nochmal kurz den Code anschaun.
Mir is grad so aufgefallen das mein Kreis zwar immer größer wird wenn ich den SeekBarprogress erhöhe, aber er wird nichtmehr kleiner.

Kann das sein weil ich 100 Kreise übereinander male aber keinen davon lösche ?

Und wie kann ich dann immer den letzten Kreis löschen ?
Code:
package com.example.grafiktest;

import org.w3c.dom.Text;


    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.RelativeLayout;
    import android.widget.SeekBar;
    import android.widget.SeekBar.OnSeekBarChangeListener;
    import android.widget.TextView;

    public class Kreis extends Activity  implements OnSeekBarChangeListener    {
        private SeekBar seekbar;
        public static int radius = 30;
        private TextView textview;
        
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_kreis);
            this.seekbar = (SeekBar)findViewById(R.id.radiusbar);
            this.textview = (TextView)findViewById(R.id.ausgabe);
            seekbar.setOnSeekBarChangeListener(this);

            
            
        }

        
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        radius = seekbar.getProgress();
        textview.setText(radius + "");

        Circle view = new Circle(this);
        RelativeLayout.LayoutParams params = 
                new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
                                           LayoutParams.FILL_PARENT);
       addContentView(view,params);
    }



    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        
    }



    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        
    }

    public class Circle extends View{
        
            
            public Circle(Context context) {
                super(context);
                
            }
            @Override
            public void draw(Canvas canvas) {
                
                
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);
                
           //     if(radius>0){
                canvas.drawCircle(200,200,radius,paint);
            //    }
                
            }
            

        }







}
 
Hab mir den link angesehen.

Aber wie soll mir
Code:
View youAddedView;
ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
for (int i = 0; i < rootView.getChildCount(); i++) {
if(rootView.getChildAt(i) == yourAddedView){
// do anything here     } }
das helfen ?

Und mit setVisibility(View.GONE) krieg ichs auch nicht hin.
 
macht dir eine Klassenvariable die von mir aus View alterKreis; heißt.
immer bevor du den neuen Kreis hinzufügst baust du den Code von oben ein.
Statt yourAddedView nimmst du halt alterKreis.

Bei //Do anything here machst du dann rootView.removeViewAt(i).
Dann sollte die View weg sein.
 
Danke für die Antwort.

Also ich hab jetz oben eine Klassenvariable.
Code:
private static View alterKreis;
und in der onProgressChanged methode
Code:
@Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        radius = seekbar.getProgress();
        textview.setText(radius + "");
        RelativeLayout lp=new RelativeLayout(this);
        
        
        
        Circle view = new Circle(this);
        RelativeLayout.LayoutParams params = 
                new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
                                           LayoutParams.FILL_PARENT);
        
        ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content);
        for (int i = 0; i < rootView.getChildCount(); i++) {
            if(rootView.getChildAt(i) == alterKreis) {
                rootView.removeViewAt(i);
                break;
            }
        }
        
        addContentView(view,params);
        
    }
Klappt aber trotzdem nicht. Muss ich nicht die Klassenvariable alterkreis mit irgendwas befüllen ?



Edit:

Habs jetz hinbekommen aber so :
Code:
RelativeLayout lp=new RelativeLayout(this);
        
        
        
        Circle view = new Circle(this);
        lp.removeView(view);

Hatte das schonmal habs nur vergessen wie ich das damals hinbekommen habe.
 
Zuletzt bearbeitet:
Ansonsten kannst du die Klassenvariable halt mit der View befüllen
addContentView(view,params);
alterKreis = view;

Beim nächsten aufruf ist alterKreis dann gefüllt mit dem vorherigen kreis
Das hatte ich vergessen zu erwähnen ;)
 
Toll,
Im Emulator funktionierts zwar, aber heute komm ich drauf auf meinem Smartphone nicht. Wieso ?

Der Kreis wird zwar gezeichnet, aber das mit removeView funktioniert auf meinem Smartphone nicht. Heißt der Kreis wird immer größer aber ich kann ihn nichtmehr kleiner machen.


Habs mit beiden versionen versucht.
lp.removeView(view)

und mit

ViewGroup rootView = (ViewGroup) findViewById(android.R.id.content); for (int i = 0; i < rootView.getChildCount(); i++) { if(rootView.getChildAt(i) == alterKreis) { rootView.removeViewAt(i); break; }
Woran kanns liegen ?
 
Zurück
Oben Unten