วาดเองได้สำหรับ ProgressBar / ProgressDialog


128

เมื่ออ่านเอกสารแบบ จำกัด ที่ Google ได้จัดเตรียมไว้ฉันรู้สึกว่าสามารถเปลี่ยนรูปลักษณ์ (วาดได้) ของ ProgressBar / ProgressDialog โดยเพียงแค่สร้างสไตล์ใหม่และกำหนดให้เป็นคุณสมบัติสไตล์ของ ProgressBar แต่ฉันไม่สามารถทำให้มันทำงานได้อย่างถูกต้อง นี่คือสิ่งที่ฉันทำจนถึงตอนนี้:

ฉันสร้างรูปร่างแบบนี้ (mp2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="ring"
  android:innerRadiusRatio="4"
  android:thicknessRatio="4"
  android:useLevel="false">
 <size android:width="50dip" android:height="50dip" />
 <gradient android:type="sweep" android:useLevel="false" android:startColor="#300000ff" android:centerColor="#500000ff" android:endColor="#ff0000ff" />
</shape>

จากนั้นสร้างภาพเคลื่อนไหว (mp3.xml) ดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="30" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="30" android:toDegrees="60" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="60" android:toDegrees="90" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="90" android:toDegrees="120" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="120" android:toDegrees="150" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="150" android:toDegrees="180" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="180" android:toDegrees="210" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="210" android:toDegrees="240" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="240" android:toDegrees="270" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="270" android:toDegrees="300" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="300" android:toDegrees="330" android:repeatCount="1" />
 </item>
 <item android:duration="70">
  <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="330" android:toDegrees="360" android:repeatCount="1" />
 </item>
</animation-list>

จากนั้นสร้างสไตล์ (attrs.xml) ดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style parent="@android:style/Widget.ProgressBar" name="customProgressBar">
  <item name="android:progressDrawable">@anim/mp3</item>
 </style>
</resources>

และใน main.xml ของฉันฉันได้ตั้งค่าสไตล์ดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" android:drawingCacheQuality="high">
 <ProgressBar android:id="@+id/ProgressBar01"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" style="@style/customProgressBar"/>
</LinearLayout>

แต่ก็ยังคงแสดงความสามารถในการเบิกจ่ายได้เหมือนเดิม ผมทำอะไรผิดหรือเปล่า?


เพิ่งเกิดขึ้นจะเรียกดูตัวอย่างและมาข้ามของคุณหลังจากที่ได้อ่านนี้ หวังว่าจะช่วยแก้ปัญหาของคุณได้
reuscam

ฉันรู้วิธีสร้างรูปร่าง / การไล่ระดับสี / ภาพเคลื่อนไหว สิ่งที่ฉันสร้างไว้ข้างต้นเป็นไปตามโพสต์ที่คุณอ้างถึง (ฉันต้องเปลี่ยนแปลงเล็กน้อยเพราะมันดูขาด ๆ หาย ๆ และช้ามาก) ฉันแค่หวังว่าจะสามารถบรรลุสิ่งนี้ได้โดยใช้ "สไตล์" ขอบคุณสำหรับคำติชมต่อไป
แซม

หากคุณต้องการปรับแต่งแถบความคืบหน้าของคุณอย่างสมบูรณ์และลองจินตนาการดูโพสต์บล็อกนี้มันอาจจะเกินกว่าที่คุณต้องการหรืออาจเป็นเพียงสิ่งที่คุณกำลังมองหา หวังว่าจะช่วยได้!
ดีซ่านใน

คำตอบ:


142

ฉันใช้สิ่งต่อไปนี้เพื่อสร้างแถบความคืบหน้าแบบกำหนดเอง

ไฟล์res/drawable/progress_bar_states.xmlประกาศสีของสถานะต่างๆ:

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

    <item android:id="@android:id/background">
        <shape>
            <gradient
                    android:startColor="#000001"
                    android:centerColor="#0b131e"
                    android:centerY="0.75"
                    android:endColor="#0d1522"
                    android:angle="270"
            />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <gradient
                        android:startColor="#234"
                        android:centerColor="#234"
                        android:centerY="0.75"
                        android:endColor="#a24"
                        android:angle="270"
                />
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <gradient
                    android:startColor="#144281"
                    android:centerColor="#0b1f3c"
                    android:centerY="0.75"
                    android:endColor="#06101d"
                    android:angle="270"
                />
            </shape>
        </clip>
    </item>

</layer-list>

และรหัสภายใน xml เลย์เอาต์ของคุณ:

<ProgressBar android:id="@+id/progressBar"
    android:progressDrawable="@drawable/progress_bar_states"
    android:layout_width="fill_parent" android:layout_height="8dip" 
    style="?android:attr/progressBarStyleHorizontal" 
    android:indeterminateOnly="false" 
    android:max="100">
</ProgressBar>

สนุก!


@YuliaRogovaya เป็นเพราะสิ่งที่วาดไม่ได้อยู่ในองค์ประกอบของคลิป? ฉันไม่สามารถทำให้มันทำงานได้เช่นกัน สงสัยว่าองค์ประกอบของคลิปเป็นกุญแจสำคัญ
Andrew Wyld

2
วิธีทำสำหรับProgressDialog?
Nezam

@Nezam ฉันให้รหัสหรือตัวอย่างที่แน่นอนไม่ได้ แต่นี่คือสิ่งที่คุณต้องทำ จัดเตรียมธีมที่กำหนดเองให้กับ ProgressDialog ธีมที่กำหนดเองจะกำหนดลักษณะแถบความคืบหน้า
โจนา

จะเป็นการดีที่จะได้เห็นภาพหน้าจอของสิ่งนี้ในการทำงาน
QED

@ โจน่าฉันรู้ว่ามันผ่านไปสักพักแล้ว แต่ฉันจะทำให้ความสูงเล็กลงได้อย่างไร?
leofontes

55

ฉันประสบปัญหาในการใช้กล่องโต้ตอบความคืบหน้าที่ไม่แน่นอนพร้อมวิธีแก้ปัญหาที่นี่หลังจากทำงานและลองผิดลองถูกแล้วฉันก็ใช้งานได้

ขั้นแรกสร้างภาพเคลื่อนไหวที่คุณต้องการใช้สำหรับกล่องโต้ตอบความคืบหน้า ในกรณีของฉันฉันใช้ 5 ภาพ

../res/anim/progress_dialog_icon_drawable_animation.xml:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/icon_progress_dialog_drawable_1" android:duration="150" />
    <item android:drawable="@drawable/icon_progress_dialog_drawable_2" android:duration="150" />
    <item android:drawable="@drawable/icon_progress_dialog_drawable_3" android:duration="150" />
    <item android:drawable="@drawable/icon_progress_dialog_drawable_4" android:duration="150" />
    <item android:drawable="@drawable/icon_progress_dialog_drawable_5" android:duration="150" />
</animation-list>

ตำแหน่งที่คุณต้องการแสดง ProgressDialog:

dialog = new ProgressDialog(Context.this);
dialog.setIndeterminate(true);
dialog.setIndeterminateDrawable(getResources().getDrawable(R.anim.progress_dialog_icon_drawable_animation));
dialog.setMessage("Some Text");
dialog.show();

วิธีนี้ง่ายมากและใช้ได้ผลสำหรับฉันคุณสามารถขยาย ProgressDialog และทำให้มันแทนที่สิ่งที่ดึงได้ภายในอย่างไรก็ตามมันซับซ้อนเกินไปสำหรับสิ่งที่ฉันต้องการดังนั้นฉันจึงไม่ได้ทำ


1
ขอบคุณที่สังเกต "dialog.setIndeterminateDrawable ()"
scottyab

มีเพียงภาพในกล่องโต้ตอบจึงไม่มีข้อความ แต่สามารถวาดได้ในกล่องโต้ตอบทั้งหมดหรือไม่?
Diego

@Diego ฉันไม่ได้ลอง แต่ฉันไม่เห็นว่าทำไมไม่ คุณได้ลองใช้ drawable ที่จะใช้พื้นที่ที่คุณต้องการ (เช่นมีอัตราส่วนยาว) และไม่ได้ตั้งค่าข้อความใด ๆ ในกล่องโต้ตอบหรือไม่?
ผ้าปิดตา

41

ลองตั้งค่า:

android:indeterminateDrawable="@drawable/progress" 

มันได้ผลสำหรับฉัน นี่คือรหัสสำหรับ progress.xml:

<?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="360">

    <shape android:shape="ring" android:innerRadiusRatio="3"
        android:thicknessRatio="8" android:useLevel="false">

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

        <gradient android:type="sweep" android:useLevel="false"
            android:startColor="#4c737373" android:centerColor="#4c737373"
            android:centerY="0.50" android:endColor="#ffffd300" />

    </shape>

</rotate> 

3
หากคุณต้องการใช้ drawable เพียงแค่android:drawable=ในแท็กหมุนแล้วลบรูปร่าง ในที่สุดก็มีคนตอบคำถามแถบความคืบหน้าในการหมุน
MinceMan

2
มันตั้งค่าสี แต่แถบความคืบหน้าไม่หมุน
Crawler

หากต้องการปรับความเร็วในการหมุนอย่างรวดเร็วandroid:toDegreesสามารถตั้งค่าให้สูงขึ้นได้ การตั้งค่าเป็นandroid:toDegrees="1080"จะเพิ่มการหมุนเป็น 3 ครั้ง
Levor

10

สไตล์ของคุณควรมีลักษณะดังนี้:

<style parent="@android:style/Widget.ProgressBar" name="customProgressBar">
    <item name="android:indeterminateDrawable">@anim/mp3</item>
</style>

6

ฉันทำรหัสของคุณฉันสามารถรันได้ แต่ฉันต้องการแก้ไขสองที่:

  1. name="android:indeterminateDrawable" แทน android:progressDrawable

  2. แก้ไขชื่อ attrs.xml ---> styles.xml


คุณแก้ไข Android ของคุณ: startColor = "# 300000ff“ เป็น # FF00ff00 แก้ไขสีอื่น
pengwang

6

ความก้าวหน้าที่กำหนดเองด้วยมาตราส่วน!

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:duration="150">
        <scale
            android:drawable="@drawable/face_no_smile_eyes_off"
            android:scaleGravity="center" />
    </item>
    <item android:duration="150">
        <scale
            android:drawable="@drawable/face_no_smile_eyes_on"
            android:scaleGravity="center" />
    </item>
    <item android:duration="150">
        <scale
            android:drawable="@drawable/face_smile_eyes_off"
            android:scaleGravity="center" />
    </item>
    <item android:duration="150">
        <scale
            android:drawable="@drawable/face_smile_eyes_on"
            android:scaleGravity="center" />
    </item>

</animation-list>

0

ฉันไม่แน่ใจ แต่ในกรณีนี้คุณยังสามารถใช้ AlertDialog ที่กำหนดเองได้อย่างสมบูรณ์โดยตั้งค่าไฟล์เลย์เอาต์แยกต่างหากในกล่องโต้ตอบการแจ้งเตือนและตั้งค่าภาพเคลื่อนไหวสำหรับมุมมองภาพของคุณโดยใช้ส่วนหนึ่งของโค้ดด้านบนซึ่งควรทำเช่นกัน!


0
public class CustomProgressBar {
    private RelativeLayout rl;
    private ProgressBar mProgressBar;
    private Context mContext;
    private String color__ = "#FF4081";
    private ViewGroup layout;
    public CustomProgressBar (Context context, boolean isMiddle, ViewGroup layout) {
        initProgressBar(context, isMiddle, layout);
    }

    public CustomProgressBar (Context context, boolean isMiddle) {
        try {
            layout = (ViewGroup) ((Activity) context).findViewById(android.R.id.content).getRootView();
        } catch (Exception e) {
            e.printStackTrace();
        }
        initProgressBar(context, isMiddle, layout);
    }

    void initProgressBar(Context context, boolean isMiddle, ViewGroup layout) {
        mContext = context;
        if (layout != null) {
            int padding;
            if (isMiddle) {
                mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall);
                // mProgressBar.setBackgroundResource(R.drawable.pb_custom_progress);//Color.parseColor("#55000000")
                padding = context.getResources().getDimensionPixelOffset(R.dimen.padding);
            } else {
                padding = context.getResources().getDimensionPixelOffset(R.dimen.padding);
                mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleSmall);
            }
            mProgressBar.setPadding(padding, padding, padding, padding);
            mProgressBar.setBackgroundResource(R.drawable.pg_back);
            mProgressBar.setIndeterminate(true);
                try {
                    color__ = AppData.getTopColor(context);//UservaluesModel.getAppSettings().getSelectedColor();
                } catch (Exception e) {
                    color__ = "#FF4081";
                }
                int color = Color.parseColor(color__);
//                color=getContrastColor(color);
//                color__ = color__.replaceAll("#", "");//R.color.colorAccent
                mProgressBar.getIndeterminateDrawable().setColorFilter(color, android.graphics.PorterDuff.Mode.SRC_ATOP);
            } 
            }

            RelativeLayout.LayoutParams params = new
                    RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            rl = new RelativeLayout(context);
            if (!isMiddle) {
                int valueInPixels = (int) context.getResources().getDimension(R.dimen.padding);
                lp.setMargins(0, 0, 0, (int) (valueInPixels / 1.5));//(int) Utils.convertDpToPixel(valueInPixels, context));
                rl.setClickable(false);
                lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            } else {
                rl.setGravity(Gravity.CENTER);
                rl.setClickable(true);
            }
            lp.addRule(RelativeLayout.CENTER_IN_PARENT);
            mProgressBar.setScaleY(1.55f);
            mProgressBar.setScaleX(1.55f);
            mProgressBar.setLayoutParams(lp);

            rl.addView(mProgressBar);
            layout.addView(rl, params);
        }
    }

    public void show() {
        if (mProgressBar != null)
            mProgressBar.setVisibility(View.VISIBLE);
    }

    public void hide() {
        if (mProgressBar != null) {
            rl.setClickable(false);
            mProgressBar.setVisibility(View.INVISIBLE);
        }
    }
}

แล้วโทร

customProgressBar = new CustomProgressBar (Activity, true);
customProgressBar .show();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.