Füllen eines Kreises allmählich von unten nach oben android

Ich habe einen Kreis mit einem Strich und weißem Hintergrund mit xml erstellt. Wie kann man allmählich von unten nach oben auf Benutzeraktionen (zB bei aufeinanderfolgenden Tastenpresse) gefüllt werden? Bildbeschreibung hier eingeben

Gibt es eine freie Bibliothek, die verwendet werden kann, um eine ähnliche Sache zu erreichen?

  • Gson 2.2.2 verursacht nur einen Stackoverflow auf 4.2.1
  • Block Home Button in Eis Sandwich und Jelly Bean
  • Wie schalte ich die Android-Taschenlampe ein
  • Android - Wörterbuchdatei. Was ist schneller, Datenbank oder Lesedatei direkt?
  • Wird JavaFX auf Android arbeiten?
  • Kann nicht nutzen getSystemService ("usagestats") Android Studio
  • Wo ist android.max_aspect meta unterscheiden
  • Best Practices für das Erstellen von Übersetzungsdateien für mehrere Plattformen
  • Wie entdecke ich Logout-Event mit dem Facebook Android API v4?
  • Warum sind angrenzende Buttons verschieben, wenn ich die Größe des Textes in einer Schaltfläche ändere
  • ADT wird nicht die Erstellung von Android-Aktivität zulassen
  • Android - Kann SQLite Cursor nach dem Schließen der Datenbank verwendet werden?
  • One Solution collect form web for “Füllen eines Kreises allmählich von unten nach oben android”

    Ich habe eine benutzerdefinierte Ansichtsklasse erstellt, die tun wird, was du willst. Es gibt vier benutzerdefinierte Attribute, die in deinem Layout gesetzt werden können xml:

    • fillColor , color – Legt die Farbe des fillColor . Voreinstellung ist Color.WHITE .
    • strokeColor , color – Legt die Farbe des Begrenzungskreises fest. Voreinstellung ist Color.BLACK .
    • strokeWidth , float – Legt die Dicke des Begrenzungskreises fest. Standard ist 1.0 .
    • value , integer: 0-100 – Setzt den Wert für den Füllbereich. Voreinstellung ist 0 .

    Bitte beachten Sie, dass diese Attribute das custom Präfix anstelle des android Präfixes in Ihrem Layout xml haben müssen. Die Root- View sollte auch den custom xml-Namespace enthalten. (Siehe untenstehendes Beispiel). Die anderen Standard- View Attribute – wie layout_width , background , etc. – stehen zur Verfügung.

    Zuerst die CircleFillView Klasse:

     public class CircleFillView extends View { public static final int MIN_VALUE = 0; public static final int MAX_VALUE = 100; private PointF center = new PointF(); private RectF circleRect = new RectF(); private Path segment = new Path(); private Paint strokePaint = new Paint(); private Paint fillPaint = new Paint(); private int radius; private int fillColor; private int strokeColor; private float strokeWidth; private int value; public CircleFillView(Context context) { this(context, null); } public CircleFillView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.CircleFillView, 0, 0); try { fillColor = a.getColor(R.styleable.CircleFillView_fillColor, Color.WHITE); strokeColor = a.getColor(R.styleable.CircleFillView_strokeColor, Color.BLACK); strokeWidth = a.getFloat(R.styleable.CircleFillView_strokeWidth, 1f); value = a.getInteger(R.styleable.CircleFillView_value, 0); adjustValue(value); } finally { a.recycle(); } fillPaint.setColor(fillColor); strokePaint.setColor(strokeColor); strokePaint.setStrokeWidth(strokeWidth); strokePaint.setStyle(Paint.Style.STROKE); } public void setFillColor(int fillColor) { this.fillColor = fillColor; fillPaint.setColor(fillColor); invalidate(); } public int getFillColor() { return fillColor; } public void setStrokeColor(int strokeColor) { this.strokeColor = strokeColor; strokePaint.setColor(strokeColor); invalidate(); } public int getStrokeColor() { return strokeColor; } public void setStrokeWidth(float strokeWidth) { this.strokeWidth = strokeWidth; strokePaint.setStrokeWidth(strokeWidth); invalidate(); } public float getStrokeWidth() { return strokeWidth; } public void setValue(int value) { adjustValue(value); setPaths(); invalidate(); } public int getValue() { return value; } private void adjustValue(int value) { this.value = Math.min(MAX_VALUE, Math.max(MIN_VALUE, value)); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); center.x = getWidth() / 2; center.y = getHeight() / 2; radius = Math.min(getWidth(), getHeight()) / 2 - (int) strokeWidth; circleRect.set(center.x - radius, center.y - radius, center.x + radius, center.y + radius); setPaths(); } private void setPaths() { float y = center.y + radius - (2 * radius * value / 100 - 1); float x = center.x - (float) Math.sqrt(Math.pow(radius, 2) - Math.pow(y - center.y, 2)); float angle = (float) Math.toDegrees(Math.atan((center.y - y) / (x - center.x))); float startAngle = 180 - angle; float sweepAngle = 2 * angle - 180; segment.rewind(); segment.addArc(circleRect, startAngle, sweepAngle); segment.close(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(segment, fillPaint); canvas.drawCircle(center.x, center.y, radius, strokePaint); } } 

    Nun, für die benutzerdefinierten xml-Attribute zu arbeiten, müssen Sie die folgende Datei in den Ordner /res/values Ihres Projekts setzen.

    attrs.xml :

     <resources> <declare-styleable name="CircleFillView" > <attr name="fillColor" format="color" /> <attr name="strokeColor" format="color" /> <attr name="strokeWidth" format="float" /> <attr name="value" format="integer" /> </declare-styleable> </resources> 

    Im Folgenden sind die Dateien für eine einfache Demonstrations-App, wo der Wert von SeekBar mit einem SeekBar gesteuert SeekBar .

    Die Layout-Datei für unsere Activity , main.xml :

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/com.example.circlefill" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" > <com.example.circlefill.CircleFillView android:id="@+id/circleFillView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#ffffff" custom:fillColor="#6bcae2" custom:strokeColor="#75b0d0" custom:strokeWidth="20" custom:value="65" /> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    Und die MainActivity Klasse:

     public class MainActivity extends Activity { CircleFillView circleFill; SeekBar seekBar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); circleFill = (CircleFillView) findViewById(R.id.circleFillView); seekBar = (SeekBar) findViewById(R.id.seekBar); seekBar.setProgress(circleFill.getValue()); seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) circleFill.setValue(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} } ); } } 

    Und ein Screenshot der Demo App:

    Bildschirmfoto

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.