অ্যান্ড্রয়েডে একটি অগ্রগতি বার কীভাবে কাস্টমাইজ করা যায়


160

আমি এমন একটি অ্যাপে কাজ করছি যেখানে আমি একটি প্রদর্শন করতে চাই ProgressBarতবে আমি ডিফল্ট অ্যান্ড্রয়েড প্রতিস্থাপন করতে চাই ProgressBar

তাহলে আমি কীভাবে কাস্টমাইজ করব ProgressBar?

এর জন্য আমার কি কিছু গ্রাফিক্স এবং অ্যানিমেশন দরকার?

আমি নিম্নলিখিত পোস্টটি পড়েছি কিন্তু এটি কাজ করতে পারিনি:

কাস্টম প্রগ্রেস বার অ্যান্ড্রয়েড


1
এই কাস্টম অগ্রগতি বারটি চেষ্টা করুন প্রগ্রেস
হুইল

উত্তর:


300

একটি অনুকূলিতকরণের ProgressBarজন্য আপনার অগ্রগতি বারের পটভূমি এবং অগ্রগতির জন্য গুণাবলী বা বৈশিষ্ট্যগুলি নির্ধারণ করতে হবে।

customprogressbar.xmlআপনার res->drawableফোল্ডারে নামের একটি এক্সএমএল ফাইল তৈরি করুন :

custom_progressbar.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Define the background properties like color etc -->
    <item android:id="@android:id/background">
    <shape>
        <gradient
                android:startColor="#000001"
                android:centerColor="#0b131e"
                android:centerY="1.0"
                android:endColor="#0d1522"
                android:angle="270"
        />
    </shape>
   </item>

  <!-- Define the progress properties like start color, end color etc -->
  <item android:id="@android:id/progress">
    <clip>
        <shape>
            <gradient
                android:startColor="#007A00"
                android:centerColor="#007A00"
                android:centerY="1.0"
                android:endColor="#06101d"
                android:angle="270"
            />
        </shape>
    </clip>
    </item>
</layer-list> 

এখন আপনাকে progressDrawableসম্পত্তিটি সেট করতে হবে customprogressbar.xml(আঁকতে সক্ষম)

আপনি এটি এক্সএমএল ফাইল বা ক্রিয়াকলাপে (রান সময়ে) করতে পারেন can

আপনার এক্সএমএলে নিম্নলিখিতটি করুন:

<ProgressBar
    android:id="@+id/progressBar1"
    style="?android:attr/progressBarStyleHorizontal"
    android:progressDrawable="@drawable/custom_progressbar"         
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

রান টাইমে নিম্নলিখিতটি করুন

// Get the Drawable custom_progressbar                     
    Drawable draw=res.getDrawable(R.drawable.custom_progressbar);
// set the drawable as progress drawable
    progressBar.setProgressDrawable(draw);

সম্পাদনা করুন: এক্সএমএল লেআউট সংশোধন করা হয়েছে


5
রেস কি ?? res.getDrawable পাওয়া যায়নি
Hiren gamit

1
@hirengamit রেজ হ'ল "রিসোর্স"। আপনার ত্রুটি সম্ভবত ইঙ্গিত করছে যে ফাইলটি পাওয়া যাবে না। "সি: / কোথাও আপনার প্রোজেক্টফোল্ডারআইএস / ড্রেস / ড্রয়যোগ্য / কাস্টম্পমোগ্রেসারবার.এক্সএমএল" <- খুঁজে পাওয়া যায় না। যদি এটি সেখানে থাকে তবে আপনার প্রকল্পটি "পরিষ্কার" করুন, এটি রিসোর্স ফাইলটিকে পুনরায় তৈরি করে।
কে - এসও-তে বিষক্রিয়া বাড়ছে।

5
@ জনসন, রেস রিসোর্সকে বোঝায়। আপনি যদি রেখাটি অঙ্কনযোগ্য অঙ্কন = getRes स्त्रोत () এ প্রতিস্থাপন করেন তবে getDrawable (R.drawable.custom_progressbar); এটি কাজ করা উচিত.
এরউইন লেংকেইক

6
এক্সটিএমএল ফাইলে এটি করা সম্ভব হলে রানটাইমের সময় অগ্রগতিটি অঙ্কনযোগ্য কেন সেট করা প্রয়োজন?
নিকোলিস আরিয়াস

1
@ নিকোলাসআরিয়াস সম্ভবত আপনি কোনও কারণ হিসাবে এর চেহারা পরিবর্তন করতে চান (উদাহরণস্বরূপ সবুজ থেকে "প্রতিক্রিয়ার অপেক্ষায়" "ত্রুটি পরিচালনার অপেক্ষায়" হিসাবে লাল হিসাবে পরিবর্তন হওয়া)
অক্রামোট

35

এরকম জটিল ক্ষেত্রে ProgressBar,

এখানে চিত্র বর্ণনা লিখুন

ব্যবহার ClipDrawable

দ্রষ্টব্য: আমি ProgressBarএখানে এই উদাহরণ ব্যবহার করি নি । আমি ক্লিপড্রেএবল ব্যবহার করে চিত্রটি ক্লিপ করে ব্যবহার করে এটি অর্জন করেছি Animation

একটি Drawableএটির বর্তমান স্তরের মানের Drawableউপর ভিত্তি করে অন্যটিকে ক্লিপ করে DrawableDrawableস্তরের উপর ভিত্তি করে শিশু কত প্রস্থ এবং উচ্চতায় ক্লিপ হয়ে যায় তা নিয়ন্ত্রণ করতে পারেন , পাশাপাশি এটির সামগ্রিক ধারকটিতে এটি কোথায় রাখা হয়েছে তা নিয়ন্ত্রণের অভিকর্ষও। Most often used to implement things like progress bars, এর সাথে অঙ্কনের স্তর বাড়িয়ে setLevel()

দ্রষ্টব্য: স্তরটি যখন 0 হয় তখন পুরোটি ক্লিপ হয় এবং দৃশ্যমান হয় না এবং স্তরটি 10,000 হয় যখন পুরোপুরি প্রকাশিত হয়।

আমি এটি তৈরি করতে এই দুটি চিত্র ব্যবহার করেছি CustomProgressBar

scall.png

scall.png

ballon_progress.png

ballon_progress.png

MainActivity.java

public class MainActivity extends ActionBarActivity {

private EditText etPercent;
private ClipDrawable mImageDrawable;

// a field in your class
private int mLevel = 0;
private int fromLevel = 0;
private int toLevel = 0;

public static final int MAX_LEVEL = 10000;
public static final int LEVEL_DIFF = 100;
public static final int DELAY = 30;

private Handler mUpHandler = new Handler();
private Runnable animateUpImage = new Runnable() {

    @Override
    public void run() {
        doTheUpAnimation(fromLevel, toLevel);
    }
};

private Handler mDownHandler = new Handler();
private Runnable animateDownImage = new Runnable() {

    @Override
    public void run() {
        doTheDownAnimation(fromLevel, toLevel);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    etPercent = (EditText) findViewById(R.id.etPercent);

    ImageView img = (ImageView) findViewById(R.id.imageView1);
    mImageDrawable = (ClipDrawable) img.getDrawable();
    mImageDrawable.setLevel(0);
}

private void doTheUpAnimation(int fromLevel, int toLevel) {
    mLevel += LEVEL_DIFF;
    mImageDrawable.setLevel(mLevel);
    if (mLevel <= toLevel) {
        mUpHandler.postDelayed(animateUpImage, DELAY);
    } else {
        mUpHandler.removeCallbacks(animateUpImage);
        MainActivity.this.fromLevel = toLevel;
    }
}

private void doTheDownAnimation(int fromLevel, int toLevel) {
    mLevel -= LEVEL_DIFF;
    mImageDrawable.setLevel(mLevel);
    if (mLevel >= toLevel) {
        mDownHandler.postDelayed(animateDownImage, DELAY);
    } else {
        mDownHandler.removeCallbacks(animateDownImage);
        MainActivity.this.fromLevel = toLevel;
    }
}

public void onClickOk(View v) {
    int temp_level = ((Integer.parseInt(etPercent.getText().toString())) * MAX_LEVEL) / 100;

    if (toLevel == temp_level || temp_level > MAX_LEVEL) {
        return;
    }
    toLevel = (temp_level <= MAX_LEVEL) ? temp_level : toLevel;
    if (toLevel > fromLevel) {
        // cancel previous process first
        mDownHandler.removeCallbacks(animateDownImage);
        MainActivity.this.fromLevel = toLevel;

        mUpHandler.post(animateUpImage);
    } else {
        // cancel previous process first
        mUpHandler.removeCallbacks(animateUpImage);
        MainActivity.this.fromLevel = toLevel;

        mDownHandler.post(animateDownImage);
    }
}
}

activity_main.xml

<LinearLayout 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:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:orientation="vertical"
tools:context=".MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <EditText
        android:id="@+id/etPercent"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:inputType="number"
        android:maxLength="3" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Ok"
        android:onClick="onClickOk" />

</LinearLayout>

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/scall" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/clip_source" />

</FrameLayout>

clip_source.xml

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@drawable/ballon_progress"
    android:gravity="bottom" />

জটিল ক্ষেত্রে HorizontalProgressBarশুধু পরিবর্তন cliporientationমধ্যে clip_source.xml এই মত,

android:clipOrientation="horizontal"

আপনি এখান থেকে সম্পূর্ণ ডেমো ডাউনলোড করতে পারেন ।


কোডটি সত্যই আকর্ষণীয় তবে এটি আমাকে আইএমজি অবজেক্টে নালপয়েন্টার ব্যতিক্রম দেয়:
পার্থ আঞ্জারিয়া

উইজেটের আইডি সন্ধান করুন, আপনার ব্যতিক্রম সমাধান করা হবে।
বিকাশ শর্মা

34

আপনার এক্সএমএলে

<ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        style="@style/CustomProgressBar" 
        android:layout_margin="5dip" />

এবং এর মধ্যে res/values/styles.xml:

<resources> 
        <style name="CustomProgressBar" parent="android:Widget.ProgressBar.Horizontal">
          <item name="android:indeterminateOnly">false</item>
          <item name="android:progressDrawable">@drawable/custom_progress_bar_horizontal</item>
          <item name="android:minHeight">10dip</item>
          <item name="android:maxHeight">20dip</item>
        </style>       
    <style name="AppTheme" parent="android:Theme.Light" />
</resources>

এবং custom_progress_bar_horizontalঅঙ্কনযোগ্য ফোল্ডারে সংরক্ষিত একটি এক্সএমএল যা আপনার কাস্টম অগ্রগতি বারটিকে সংজ্ঞায়িত করে। আরও বিশদের জন্য এই ব্লগ দেখুন

আমি আশা করি এটা তোমাকে সাহায্য করবে।


10

স্পিনারের ধরণের ক্ষেত্রে প্রগতিবারের রঙটি কাস্টমাইজ করার জন্য একটি এক্সএমএল ফাইলের প্রয়োজন এবং তাদের নিজ নিজ জাভা ফাইলগুলিতে কোড শুরু করতে হবে।

একটি এক্সএমএল ফাইল তৈরি করুন এবং প্রগতিবার.এক্সএমএল হিসাবে নাম দিন

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    tools:context=".Radio_Activity" >

    <LinearLayout
        android:id="@+id/progressbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <ProgressBar
            android:id="@+id/spinner"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </ProgressBar>
    </LinearLayout>

</LinearLayout>

বিভিন্ন প্রত্যাশিত রঙে স্পিনার পেতে নিম্নলিখিত কোডটি ব্যবহার করুন e আমরা স্পেনারকে নীল রঙে প্রদর্শন করতে হেক্সকোড ব্যবহার করি।

Progressbar spinner = (ProgressBar) progrees.findViewById(R.id.spinner);
spinner.getIndeterminateDrawable().setColorFilter(Color.parseColor("#80DAEB"),
                android.graphics.PorterDuff.Mode.MULTIPLY);

পুরো অ্যাপ্লিকেশনটির জন্য এই রঙিন ফিল্টারটি সেট করার কোনও উপায় কী আছে, মানে প্রতিটি প্রগতি বারে এটি স্টাইল বা স্টাটে সেট করার মতো? thnx
হুগো

8

দুটি ধরণের অগ্রগতি বার রয়েছে যা নির্ধারিত অগ্রগতি বার (নির্দিষ্ট সময়কাল) এবং অনির্দিষ্ট অগ্রগতি বার (অজানা সময়কাল) বলে।

উভয় ধরণের প্রগতি বারের জন্য ড্রয়যোগ্যকে এক্সএমএল সংস্থান হিসাবে অঙ্কনযোগ্যকে সংজ্ঞায়িত করে কাস্টমাইজ করা যায়। আপনি অগ্রগতি বার শৈলী এবং কাস্টমাইজেশন সম্পর্কে আরও তথ্য http://www.zoftino.com/android-progressbar-and-custom-progressbar- উদাহরণগুলিতে পাবেন

স্থির বা অনুভূমিক অগ্রগতি বার অনুকূলিতকরণ:

এক্সএমএলের নীচে অনুভূমিক অগ্রগতি বার কাস্টমাইজেশনের জন্য একটি অঙ্কনযোগ্য উত্স।

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background"
        android:gravity="center_vertical|fill_horizontal">
        <shape android:shape="rectangle"
            android:tint="?attr/colorControlNormal">
            <corners android:radius="8dp"/>
            <size android:height="20dp" />
            <solid android:color="#90caf9" />
        </shape>
    </item>
    <item android:id="@android:id/progress"
        android:gravity="center_vertical|fill_horizontal">
        <scale android:scaleWidth="100%">
            <shape android:shape="rectangle"
                android:tint="?attr/colorControlActivated">
                <corners android:radius="8dp"/>
                <size android:height="20dp" />
                <solid android:color="#b9f6ca" />
            </shape>
        </scale>
    </item>
</layer-list>

অনির্দিষ্ট অগ্রগতি বার কাস্টমাইজ করা

এক্সএমএল নীচে বিজ্ঞপ্তি অগ্রগতি বার কাস্টমাইজেশন জন্য একটি অঙ্কনযোগ্য উত্স আছে।

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/progress"
        android:top="16dp"
        android:bottom="16dp">
                <rotate
                    android:fromDegrees="45"
                    android:pivotX="50%"
                    android:pivotY="50%"
                    android:toDegrees="315">
                    <shape android:shape="rectangle">
                        <size
                            android:width="80dp"
                            android:height="80dp" />
                        <stroke
                            android:width="6dp"
                            android:color="#b71c1c" />
                    </shape>
                </rotate>           
    </item>
</layer-list>

5

হটস্টারের মতো কাস্টম প্রগতিবার তৈরি করা।

  1. লেআউট ফাইলটিতে অগ্রগতি বার যুক্ত করুন এবং অঙ্কনযোগ্য ফাইলের সাথে অনির্দিষ্ট ড্রওয়েবল সেট করুন।

activity_main.xml

<ProgressBar
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"
    android:id="@+id/player_progressbar"
    android:indeterminateDrawable="@drawable/custom_progress_bar"
    />
  1. রেস-ড্রইয়েবলের জন্য নতুন এক্সএমএল ফাইল তৈরি করুন

custom_progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
    <rotate  xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="1080" >

    <shape
        android:innerRadius="35dp"
        android:shape="ring"
        android:thickness="3dp"
        android:useLevel="false" >
       <size
           android:height="80dp"
           android:width="80dp" />

       <gradient
            android:centerColor="#80b7b4b2"
            android:centerY="0.5"
            android:endColor="#f4eef0"
            android:startColor="#00938c87"
            android:type="sweep"
            android:useLevel="false" />
    </shape>

</rotate>

4

অ্যান্ড্রয়েডে অগ্রগতি বারটি কাস্টমাইজ করার সহজ উপায়:

  1. সংলাপটি শুরু করুন এবং দেখান:

    MyProgressDialog progressdialog = new MyProgressDialog(getActivity());
    progressdialog.show();
  2. পদ্ধতি তৈরি করুন:

    public class MyProgressDialog extends AlertDialog {
          public MyProgressDialog(Context context) {
              super(context);
              getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
          }
    
          @Override
          public void show() {
              super.show();
              setContentView(R.layout.dialog_progress);
          }
    }
  3. এক্সএমএল বিন্যাস তৈরি করুন:

    <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="@android:color/transparent"
      android:clickable="true">
    
        <RelativeLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerInParent="true">
    
          <ProgressBar
             android:id="@+id/progressbarr"
             android:layout_width="@dimen/eightfive"
             android:layout_height="@dimen/eightfive"
             android:layout_centerInParent="true"
            android:indeterminateDrawable="@drawable/progresscustombg" />
    
          <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerHorizontal="true"
             android:layout_below="@+id/progressbarr"
             android:layout_marginTop="@dimen/_3sdp"
             android:textColor="@color/white"
             android:text="Please wait"/>
        </RelativeLayout>
    </RelativeLayout>
  4. আকৃতি প্রগ্রেস্টকম্বম্ব.এক্সএমএল তৈরি করুন এবং রেস / অঙ্কনযোগ্য রাখুন:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
      android:fromDegrees="0"
      android:pivotX="50%"
      android:pivotY="50%"
      android:toDegrees="360" >
    
        <shape
           android:innerRadiusRatio="3"
           android:shape="ring"
           android:thicknessRatio="20"
           android:useLevel="false" >
            <size
                android:height="@dimen/eightfive"
                android:width="@dimen/eightfive" />
    
            <gradient
                android:centerY="0.50"
                android:endColor="@color/color_green_icash"
                android:startColor="#FFFFFF"
                android:type="sweep"
                android:useLevel="false" />
        </shape>
    
    </rotate>

3

কাস্টম অঙ্কনযোগ্য ব্যবহারের জন্য:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="360"
android:drawable="@drawable/my_drawable"
android:pivotX="50%"
android:pivotY="50%" />

(রেজ / ড্রয়যোগ্য এর অধীনে যোগ করুন progress.xml)। my_drawableএক্সএমএল, পিএনজি হতে পারে

তারপরে আপনার লেআউট ব্যবহার করুন

<ProgressBar
        android:id="@+id/progressBar"
        android:indeterminateDrawable="@drawable/progress_circle"
...
/>

1
এটি আমার দেখা সেরা উত্তর। মোহন মত কাজ করে। ধন্যবাদ
রাজেশ্বর

1

আপনি যদি কোডটিতে এটি করতে চান তবে এখানে একটি নমুনা রয়েছে:

pd = new ProgressDialog(MainActivity.this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
pd.getWindow().setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL);
TextView tv = new TextView(this);
tv.setTextColor(Color.WHITE);
tv.setTextSize(20);
tv.setText("Waiting...");
pd.setCustomTitle(tv);
pd.setIndeterminate(true);
pd.show();

টেক্সটভিউ ব্যবহার করা আপনাকে আপনার পাঠ্যের রঙ, আকার এবং ফন্ট পরিবর্তন করতে একটি বিকল্প দেয়। অন্যথায় আপনি যথারীতি কেবল সেটম্যাসেজ () কল করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.