ProgressBar / ProgressDialog için Özel Çekilebilir


128

Google'ın sağladığı sınırlı belgeleri okurken, bir ProgressBar / ProgressDialog'un görünümünü (çekilebilir) değiştirmenin, yeni bir stil oluşturarak ve onu ProgressBar'ın stil özelliğine atayarak değiştirmenin mümkün olduğu hissine kapılıyorum. Ama bunun düzgün çalışmasını sağlayamıyorum. İşte şimdiye kadar yaptıklarım:

Bunun gibi bir şekil oluşturdum (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>

daha sonra bunun gibi bir animasyon (mp3.xml) oluşturdu:

<?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>

sonra şöyle bir stil (attrs.xml) oluşturdu:

<?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>

ve main.xml dosyamda stili şu şekilde ayarladım:

<?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>

Ama yine de eskisi gibi aynı çekilebilirliği gösteriyor. Neyi yanlış yapıyorum?


Sadece örneklere göz atıyordum ve bunu okuduktan sonra sizinkiyle karşılaştı . Umarım sorununuzu çözer.
reuscam

Nasıl şekil / gradyan / animasyon yaratacağımı biliyordum. Yukarıda oluşturduğum, atıfta bulunduğunuz gönderiye dayanıyor (çok dalgalı ve yavaş göründüğü için biraz değiştirmek zorunda kaldım). Bunu "stil" ile başarabilmeyi umuyordum. Yine de yanıt için teşekkürler
Sam

İlerleme çubuğunuzu tamamen özelleştirmek ve gerçekten süslü olmak istiyorsanız bu blog gönderisine bir göz atın İstediğinizin biraz ötesinde veya tam olarak aradığınız şey olabilir. Umarım yardımcı olur!
jagsaund

Yanıtlar:


142

Aşağıdakileri özel bir ilerleme çubuğu oluşturmak için kullandım.

Dosya res/drawable/progress_bar_states.xml, farklı durumların renklerini bildirir:

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

Ve xml düzeninizin içindeki kod:

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

Zevk almak!


@YuliaRogovaya, çekilebilir öğeler klip öğelerinde olmadığı için mi? Ben de çalışmasını sağlayamadım; klip öğesinin anahtar olduğundan şüpheleniyorum.
Andrew Wyld

2
bir için bunu nasıl yapmalı ProgressDialog?
Nezam

@Nezam Size tam kodu veya örnekleri veremem ama yapmanız gereken bu. ProgressDialog'a özel bir tema sağlayın. Özel tema ilerleme çubuğu stilini tanımlar.
Jona

Bu şeyin eylem
halindeyken

@Jona Bir süredir biliyorum ama bu çekmeceyi nasıl daha küçük yapabilirim ??
leofontes

55

Buradaki çözümle bir Belirsiz İlerleme İletişim Kutusunu kullanırken biraz sorun yaşıyordum, biraz çalışma ve deneme yanılma sonrasında onu çalıştırdım.

İlk olarak, İlerleme İletişim Kutusu için kullanmak istediğiniz animasyonu oluşturun. Benim durumumda 5 resim kullandım.

../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'u göstermek istediğiniz yer:

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

Bu çözüm gerçekten basit ve benim için işe yaradı, ProgressDialog'u genişletebilir ve çekilebilir olanı dahili olarak geçersiz kılabilirsiniz, ancak bu ihtiyacım olan şey için gerçekten çok karmaşıktı, bu yüzden yapmadım.


1
"Dialog.setIndeterminateDrawable ()" ifadesini kaydettiğiniz için teşekkürler
scottyab

İletişim kutusunda yalnızca bir görüntüye sahip olmanın bir yolu var, yani mesaj yok, ancak iletişim kutusunun tamamında bir çekilebilirlik var mı?
Diego

@Diego Denemedim ama neden olmasın anlamıyorum. İstediğiniz alanı kaplayacak (yani uzun bir en-boy oranına sahip) ve Diyalog'a herhangi bir metin ayarlamayan bir çekilebilir dosya kullanmayı denediniz mi?
blindstuff

41

Ayarlamayı deneyin:

android:indeterminateDrawable="@drawable/progress" 

Benim için çalıştı. İşte progress.xml kodu da:

<?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
Bir çekmece kullanmak istiyorsanız, o zaman sadece android:drawable=döndür etiketinde ve ardından şekli kaldırın. Sonunda dönen ilerleme çubuğu sorusuna cevap veren biri.
MinceMan

2
Rengi belirliyor ancak ilerleme çubuğu dönmüyor
Tarayıcı

Dönme hızını hızlı bir şekilde ayarlamak android:toDegreesiçin daha yüksek bir değere ayarlanabilir. Buna ayarlamak android:toDegrees="1080", dönüşü 3 kez artıracaktır.
Levor

10

Tarzınız şöyle görünmeli:

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

6

Kodunuzu yapıyorum. Çalışabilirim ama iki yeri değiştirmem gerekiyor:

  1. name="android:indeterminateDrawable" onun yerine android:progressDrawable

  2. attrs.xml adını değiştir -> styles.xml


android'inizi değiştirin: startColor = "# 300000ff", # FF00ff00, başka bir rengi değiştirin
pengwang

6

Ölçekli özel ilerleme!

<?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

Emin değilim, ancak bu durumda, uyarı iletişim kutusunda ayrı bir düzen dosyası ayarlayarak tamamen özelleştirilmiş bir AlertDialog ile devam edebilir ve yukarıdaki kodunuzun aynı zamanda yapması gereken bir bölümünü kullanarak görüntü görünümünüz için animasyonu ayarlayabilirsiniz!


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

Ve sonra ara

customProgressBar = new CustomProgressBar (Activity, true);
customProgressBar .show();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.