Android 进度条的圆半径动态变化

标签 android layout view progress-bar geometry

我想根据 slider 位置更改圆半径

这两个都是我单独创建的。 同时将圆形方法应用于进度栏。 面临错误。

实际上我用

来调用进度条(Seek Bar)
setContentView(R.layout.main);

正如你所知,为了绘制圆圈,我必须使用setContentView(demoview);

查询:我想将显示的布局合并到图像中。

我不知道这可能吗?

任何指导,教程都很有值(value)。

感谢您抽出宝贵的时间来解答我的疑问。 希望您有解决方案。

enter image description here

最佳答案

看看这个.. 我没有使用 android 搜索栏,而是在 Canvas 上绘制类似的搜索栏。 检查此代码是否可以帮助您..

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;
    }
}

这是我的 Activity 类:

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));
    }
}

关于Android 进度条的圆半径动态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395137/

相关文章:

java - 是否可以在 Eclipse 中链接条件断点和剪贴簿?

android - 调用 popBackStack() 后当前 fragment 会发生什么情况?

android - 填充不适用于 Android

Java GUI 将布局放置在 boxlayout 下

java - Android:查看 - child 已经有 parent

ios - 水平堆栈 View 新行 - Swift

android - eclipse : Android not adding id class to R. java

android - 找不到从方法 Y 引用的类 X

Android TextInputLayout/EditText 不是全尺寸和截断文本

ios - 如何在没有 Tab 或 Nav Controller 的情况下使用 Storyboard 从 AppDelegate 实例化不同的 View ?