Android Progressbar с радиусом круга изменяется динамически - PullRequest
2 голосов
/ 22 февраля 2012

Я хочу изменить радиус круга в зависимости от положения ползунка

Я создал оба по отдельности. в то время как примените метод круга к индикатору прогресса. столкновение с ошибкой.

На самом деле я называю Progress-Bar (Seek Bar) с

setContentView(R.layout.main);

и для рисования круга, как вы знаете, я использовал setContentView(demoview);

Запрос : Я хочу объединить оба макета как отображение в изображение.

Я понятия не имел, будет ли это возможно или нет?

Любое руководство, учебник заметен.

Спасибо, что уделили ваше драгоценное время на мой запрос. Надеюсь, у вас есть решение.

enter image description here

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Проверьте это .. Я не использую панель поиска для Android, вместо этого я рисую аналогичную панель поиска на холсте .. Проверьте, может ли этот код помочь вам ..

package com.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class SampleComp extends View implements OnTouchListener {

    private Paint paint = null;
    private int width = 0;
    private int height = 0;
    private int barStartX = 20;
    private int barStartY = 20;
    private int barEndX;
    private int barEndY = 30;
    private int radius;
    private int heightAvailableForCircle;
    private int widthAvailableForCircle;
    private int maxRadius;
    private int totalSeekBarLength;
    private int currentSeekBarLength = 10;
    private int whatPercentOfSeekBarIsSelected = 50;

    public SampleComp(Context context) {

        super(context);
        paint = new Paint();
        paint.setAntiAlias(true);
        setOnTouchListener(this);
    }
    public SampleComp(Context context, AttributeSet attrs) {

        super(context, attrs);
        paint = new Paint();
        paint.setAntiAlias(true);
    }
    public SampleComp(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);
        paint = new Paint();
        paint.setAntiAlias(true);
    }

    @Override
    public void onDraw(Canvas canvas){

        barEndX = getWidth() - 20;
        paint.setColor(Color.WHITE);
        setWidth(canvas.getWidth());
        setHeight(canvas.getHeight());

        setHeightAvailableForCircle(getViewHeight() - barEndY);
        setWidthAvailableForCircle(getViewWidth() - 40);
        System.out.println("heightAvailableForCircle: "+getAvailableHeightForCircle());
        System.out.println("widthAvailableForCircle: "+getWidthAvailableForCircle());
        totalSeekBarLength = barEndX - barStartX;
        System.out.println("SEEK LEN: "+totalSeekBarLength);
        canvas.drawRect(barStartX, barStartY, barEndX, barEndY, paint);
        paint.setColor(Color.BLUE);
        setMaxRadius(heightAvailableForCircle, widthAvailableForCircle);
        whatPercentOfSeekBarIsSelected = getSelectedSeekBarPercentage(totalSeekBarLength,getCurrentSeekBarLenghtSelected());
        System.out.println("whatPercentOfSeekBarIsSelected: "+whatPercentOfSeekBarIsSelected);
        System.out.println("!!!!!: "+canvas.getWidth());
        System.out.println("@@@@: "+getViewWidth());
        System.out.println("^^^^^^^^^************: "+ (whatPercentOfSeekBarIsSelected * (getViewWidth() - 40)) / 100);
        canvas.drawRect(barStartX, barStartY, ( (whatPercentOfSeekBarIsSelected * (getViewWidth() - 40)) / 100) + 20,
                barEndY, paint);
        paint.setColor(Color.GRAY);
        setRadius(whatPercentOfSeekBarIsSelected);
        canvas.drawCircle( (canvas.getWidth())/2, (canvas.getHeight() - 30)/2, radius, paint);
    }

    private void setRadius(int per){

        this.radius = (getMaxRadius() * per)/100;
    }
    private int getSelectedSeekBarPercentage(int total, int current){

        int per = 0;
        per = ( (current * 100) / total);
        return per;
    }
    private void setRadius(int total, int current){

        System.out.println("total: "+total);
        System.out.println("current: "+current);
        this.radius = ( ( (getMaxRadius()/2) * current) / 100);
        System.out.println("radius: "+this.radius);
    }
    private void setMaxRadius(int h, int w){

        this.maxRadius = h < w ? h/2 : w/2 ;
    }
    private int getMaxRadius(){

        return this.maxRadius;
    }
    private void setWidth(int w){

        this.width = w;
    }

    private void setHeight(int h){

        this.height = h;
    }

    private int getViewWidth(){

        return this.width;
    }

    private int getViewHeight() {

        return this.height;
    }

    private void setHeightAvailableForCircle(int availableHeightForCircle){

        this.heightAvailableForCircle = availableHeightForCircle;
    }
    private int getAvailableHeightForCircle(){

        return this.heightAvailableForCircle;
    }

    private void setWidthAvailableForCircle(int wid){

        this.widthAvailableForCircle = wid;
    }

    private int getWidthAvailableForCircle(){

        return this.widthAvailableForCircle;
    }
    private void setCurrentSeekBarLength(int x){

        this.currentSeekBarLength = x;
    }
    private int getCurrentSeekBarLenghtSelected(){

        return this.currentSeekBarLength;
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();
        System.out.println("x: "+x);
        System.out.println("y: "+y);

        if(x >= 10 && x<= barEndX && y >= 10 && y <= 30){

            System.out.println("TRUE");
            setCurrentSeekBarLength(x - 20);
            invalidate();
        }
        return false;
    }
}

А это мой класс занятий:

package com.test;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.ImageView;

public class SampleActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(new SampleComp(this));
    }
}
0 голосов
/ 22 февраля 2012

Ознакомьтесь с руководством по работе с пользовательскими компонентами Android . Вы в основном должны получить свой компонент круга из android.view.View. Затем вы можете добавить его в свой макет, как и любой другой компонент.

0 голосов
/ 22 февраля 2012

Можете ли вы быть немного более конкретным относительно того, чего вы хотите достичь. Ваш вопрос не так ясен. Что я могу разглядеть, так это то, что вы хотите увеличить / уменьшить радиус круга на основе значения индикатора выполнения.

...