android style كيفية إنشاء شريط التقدم الدائري في الروبوت الذي يدور على ذلك؟




progress dialog android (8)

أحاول إنشاء شريط تقريب مدورة. هذا ما أريد تحقيقه

هناك حلقة خلفية رمادية اللون. وأعلاها ، يظهر شريط أزرق اللون يتقدم في مسار دائري من 0 إلى 360 في 60 أو أي مقدار من الثواني.

هنا هو رمز المثال الخاص بي.

<ProgressBar
            android:id="@+id/ProgressBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            style="?android:attr/progressBarStyleLarge"
            android:indeterminateDrawable="@drawable/progressBarBG"
            android:progress="50"
            />

للقيام بذلك ، في "progressBarBG" القابل للقياس ، أقوم بإنشاء قائمة طبقات وداخل قائمة الطبقات تلك ، أعطي عنصرين كما هو موضح.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape
            android:shape="ring"
            android:innerRadius="64dp"
            android:thickness="8dp"
            android:useLevel="false">

        <solid android:color="@color/grey" />
    </shape>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape
                android:shape="ring"
                android:innerRadius="64dp"
                android:thickness="8dp"
                android:useLevel="false">

            <solid android:color="@color/blue" />
        </shape>
    </clip>
</item>

الآن ، يتم إنشاء الحلقة الرمادية الأولى بشكل جيد. الحلقة الزرقاء تبدأ من اليسار إلى اليسار ، وتذهب إلى اليمين تمامًا مثل كيفية عمل شريط التقدم الخطي. هذه هي الطريقة التي تظهر بها عند تقدم 50٪ مع ظهور السهم باللون الأحمر يوضح الاتجاه.

أرغب في تحريك شريط التقدم الأزرق في مسار دائري كما هو متوقع.


package com.example.ankitrajpoot.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;


public class MainActivity extends Activity {

    private ProgressBar spinner;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        spinner=(ProgressBar)findViewById(R.id.progressBar);
        spinner.setVisibility(View.VISIBLE);
    }
}

أكس

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/loadingPanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">

<ProgressBar
    android:id="@+id/progressBar"

    android:layout_width="48dp"
    style="?android:attr/progressBarStyleLarge"
    android:layout_height="48dp"
    android:indeterminateDrawable="@drawable/circular_progress_bar"
    android:indeterminate="true" />
</RelativeLayout>





<?xml version="1.0" encoding="utf-8"?>
<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="0"
    android:toDegrees="1080">
    <shape
        android:shape="ring"
        android:innerRadiusRatio="3"
        android:thicknessRatio="8"
        android:useLevel="false">

        <size
            android:width="56dip"
            android:height="56dip" />

        <gradient
            android:type="sweep"
            android:useLevel="false"
            android:startColor="@android:color/transparent"
            android:endColor="#1e9dff"
            android:angle="0"
            />

    </shape>
</rotate>

Pedram ، الحل القديم الخاص بك يعمل بشكل جيد في المصاصة أيضًا (وأفضل من جديد حيث أنه قابل للاستخدام في كل مكان ، بما في ذلك في وجهات النظر عن بُعد) فقط قم بتغيير رمز circular_progress_bar.xml الخاص بك إلى:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="1dp"
        android:useLevel="true"> <!-- Just add this line -->
        <gradient
            android:angle="0"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>

لقد كتبت مثالا تفصيليا على شريط التقدم الدائري في الروبوت هنا على بلدي بلوق demonuts.com . يمكنك أيضا إتباع التعليمات البرمجية المصدر الكامل والشرح هناك.

وإليك الطريقة التي جعلت بها شريط التقدم الدائري مع نسبة داخل الدائرة في رمز خال من دون أي مكتبة.

أولاً إنشاء ملف قابل للسحب يسمى circular.xml

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/secondaryProgress">
        <shape
            android:innerRadiusRatio="6"
            android:shape="ring"
            android:thicknessRatio="20.0"
            android:useLevel="true">


            <gradient
                android:centerColor="#999999"
                android:endColor="#999999"
                android:startColor="#999999"
                android:type="sweep" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">

            <shape
                android:innerRadiusRatio="6"
                android:shape="ring"
                android:thicknessRatio="20.0"
                android:useLevel="true">


                <rotate
                    android:fromDegrees="0"
                    android:pivotX="50%"
                    android:pivotY="50%"
                    android:toDegrees="360" />

                <gradient
                    android:centerColor="#00FF00"
                    android:endColor="#00FF00"
                    android:startColor="#00FF00"
                    android:type="sweep" />

            </shape>
        </rotate>
    </item>
</layer-list>

الآن في your activity_main.xml أضف ما يلي:

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dialog"
    tools:context="com.example.parsaniahardik.progressanimation.MainActivity">

    <ProgressBar

        android:id="@+id/circularProgressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:indeterminate="false"
        android:max="100"
        android:progress="50"
        android:layout_centerInParent="true"
        android:progressDrawable="@drawable/circular"
        android:secondaryProgress="100"
        />

    <ImageView
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:background="@drawable/whitecircle"
        android:layout_centerInParent="true"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:gravity="center"
        android:text="25%"
        android:layout_centerInParent="true"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="20sp" />

</RelativeLayout>

in activity_main.xml لقد استخدمت صورة دائرية واحدة مع خلفية بيضاء لإظهار الخلفية البيضاء حول النسبة المئوية. هنا الصورة:

يمكنك تغيير لون هذه الصورة لتعيين لون مخصص حول نص النسبة المئوية.

الآن أخيراً أضف التعليمات البرمجية التالية إلى MainActivity.java :

import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.DecelerateInterpolator;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    int pStatus = 0;
    private Handler handler = new Handler();
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        Drawable drawable = res.getDrawable(R.drawable.circular);
        final ProgressBar mProgress = (ProgressBar) findViewById(R.id.circularProgressbar);
        mProgress.setProgress(0);   // Main Progress
        mProgress.setSecondaryProgress(100); // Secondary Progress
        mProgress.setMax(100); // Maximum Progress
        mProgress.setProgressDrawable(drawable);

      /*  ObjectAnimator animation = ObjectAnimator.ofInt(mProgress, "progress", 0, 100);
        animation.setDuration(50000);
        animation.setInterpolator(new DecelerateInterpolator());
        animation.start();*/

        tv = (TextView) findViewById(R.id.tv);
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (pStatus < 100) {
                    pStatus += 1;

                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            mProgress.setProgress(pStatus);
                            tv.setText(pStatus + "%");

                        }
                    });
                    try {
                        // Sleep for 200 milliseconds.
                        // Just to display the progress slowly
                        Thread.sleep(8); //thread will take approx 1.5 seconds to finish
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

إذا كنت تريد إنشاء شريط تقدم أفقي ، اتبع هذا الرابط ، فلديه العديد من الأمثلة القيمة مع شفرة المصدر:
http://www.skholingua.com/android-basic/user-interface/form-widgets/progressbar


https://github.com/passsy/android-HoloCircularProgressBar هو أحد الأمثلة على مكتبة تقوم بذلك. كما ذكر Tenfour04 ، يجب أن تكون مخصصة إلى حد ما ، حيث أن ذلك لا يتم دعمه مباشرة من الصندوق. إذا لم تتصرف هذه المكتبة بالشكل الذي تريده ، فيمكنك تشبيكه وتعديل التفاصيل لجعلها تعمل حسب رغبتك. إذا نفذت شيئًا يمكن للآخرين إعادة استخدامه ، فيمكنك أيضًا تقديم طلب سحب لإعادة الدمج مرة أخرى!


جرب هذه الطريقة لإنشاء صورة نقطية وتعيينها لعرض الصورة.

private void circularImageBar(ImageView iv2, int i) {


    Bitmap b = Bitmap.createBitmap(300, 300,Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(b); 
    Paint paint = new Paint();

        paint.setColor(Color.parseColor("#c4c4c4"));
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(150, 150, 140, paint);

        paint.setColor(Color.parseColor("#FFDB4C"));
        paint.setStrokeWidth(10);   
        paint.setStyle(Paint.Style.FILL);
        final RectF oval = new RectF();
        paint.setStyle(Paint.Style.STROKE);
        oval.set(10,10,290,290);

        canvas.drawArc(oval, 270, ((i*360)/100), false, paint);
        paint.setStrokeWidth(0);    
        paint.setTextAlign(Align.CENTER);
        paint.setColor(Color.parseColor("#8E8E93")); 
        paint.setTextSize(140);

        canvas.drawText(""+i, 150, 150+(paint.getTextSize()/3), paint); 

        iv2.setImageBitmap(b);
}

يتغيرون

android:useLevel="false"

إلى

android:useLevel="true"

ل sahpe الثانية مع id="@android:id/progress

نأمل أن يعمل


هنا هو حلّي.

اجابة قصيرة:

بدلاً من إنشاء layer-list ، قمت بفصلها في ملفين. واحد لـ ProgressBar وواحد لخلفيته.

هذا هو ملف ProgressDrawable (drawable folder): circular_progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="1dp"
        android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->

        <gradient
            android:angle="0"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>

وهذا background (drawable folder): circle_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadiusRatio="2.5"
    android:thickness="1dp"
    android:useLevel="false">

    <solid android:color="#CCC" />

</shape>

وفي النهاية ، داخل التنسيق الذي تعمل فيه:

<ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/circular_progress_bar"
        android:background="@drawable/circle_shape"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
        android:progress="65" />

وهنا النتيجة:

اجابة طويلة:

فئة فرعية من فئة عرض ، وجهة نظر مخصصة

هنا هو المشروع الكامل على جيثب


أدركت مكتبة مفتوحة المصدر على GitHub CircularProgressBar تفعل بالضبط ما تريد أبسط طريقة ممكنة:

الاستعمال

لجعل ProgressBar دائري إضافة CircularProgressBar في تخطيط XML وإضافة مكتبة CircularProgressBar في جهاز الإسقاط الخاص بك أو يمكنك أيضا الاستيلاء عليه عبر Gradle:

compile 'com.mikhaellopez:circularprogressbar:1.0.0'

XML

<com.mikhaellopez.circularprogressbar.CircularProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:background_progressbar_color="#FFCDD2"
    app:background_progressbar_width="5dp"
    app:progressbar_color="#F44336"
    app:progressbar_width="10dp" />

يجب عليك استخدام الخصائص التالية في XML الخاص بك لتغيير CircularProgressBar الخاص بك.

الخصائص:

  • app:progress (عدد صحيح) >> الافتراضي 0
  • app:progressbar_color (color) >> default BLACK
  • app:background_progressbar_color (لون) >> افتراضي GREY
  • app:progressbar_width (البعد) >> الافتراضي 7dp
  • app:background_progressbar_width (dimension) >> default 3dp

JAVA

CircularProgressBar circularProgressBar = (CircularProgressBar)findViewById(R.id.yourCircularProgressbar);
circularProgressBar.setColor(ContextCompat.getColor(this, R.color.progressBarColor));
circularProgressBar.setBackgroundColor(ContextCompat.getColor(this, R.color.backgroundProgressBarColor));
circularProgressBar.setProgressBarWidth(getResources().getDimension(R.dimen.progressBarWidth));
circularProgressBar.setBackgroundProgressBarWidth(getResources().getDimension(R.dimen.backgroundProgressBarWidth));
int animationDuration = 2500; // 2500ms = 2,5s
circularProgressBar.setProgressWithAnimation(65, animationDuration); // Default duration = 1500ms

شوكة أو تحميل هذه المكتبة هنا >> CircularProgressBar





progress-bar