2011-01-03 48 views
6

Tôi havent có một đầu mối để làm thế nào để làm điều này. Thanh tiến trình của tôi phải là hình dạng của đám mây. Ai đó có thể hướng dẫn tôi đến một cuốn sách, hướng dẫn hoặc chỉ cần cung cấp đúng phương pháp từng bước?Thanh tiến trình tùy chỉnh trong Android?

Cảm ơn bạn đã dành thời gian.

Trả lời

15

Như được hiển thị here bạn có thể sử dụng chế độ xem hình ảnh để có được thanh cuộn tùy chỉnh như hiệu ứng.

Cách bố trí XML cho thanh tiến trình tùy chỉnh trong ví dụ đó là:

<RelativeLayout android:id="@+id/RelativeLayout01" 
    android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" 
    android:gravity="center" android:layout_height="wrap_content" 
    android:paddingLeft="30sp" android:paddingRight="30sp"> 
    <ImageView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:src="@drawable/progress_1" 
     android:id="@+id/imgOne" android:tag="1"></ImageView> 
    <ImageView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:src="@drawable/progress_2" 
     android:id="@+id/imgTwo" android:layout_toRightOf="@id/imgOne" 
     android:tag="2"></ImageView> 
    <ImageView android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:src="@drawable/progress_3" 
     android:id="@+id/imgThree" android:layout_toRightOf="@id/imgTwo" 
     android:tag="3"></ImageView> 
    <TextView android:id="@+id/TextView01" android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/imgThree" android:layout_width="wrap_content" 
     android:layout_alignTop="@id/imgThree" android:layout_alignBottom="@id/imgThree" 
     android:gravity="bottom" android:text="Please Wait..."></TextView> 
</RelativeLayout> 

Và sau đó ông tạo ra một danh sách các hình ảnh trong tập tin lớp như:

/** 
* Loads the layout and sets the initial set of images 
*/ 
private void prepareLayout() { 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.myprogressbar, null); 
    addView(view); 

    imageHolders = new ArrayList<ImageView>(); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgOne)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgTwo)); 
    imageHolders.add((ImageView) view.findViewById(R.id.imgThree)); 

    // Prepare an array list of images to be animated 
    images = new ArrayList<String>(); 

    images.add("progress_1"); 
    images.add("progress_2"); 
    images.add("progress_3"); 
    images.add("progress_4"); 
    images.add("progress_5"); 
    images.add("progress_6"); 
    images.add("progress_7"); 
    images.add("progress_8"); 
    images.add("progress_9"); 
} 

Sau đó, ông bắt đầu một chủ đề mà ngủ trong 0,3 giây và gọi trình xử lý với handler.sendEmptyMessage(0); và cuối cùng là trong Handler, anh ấy thực hiện phần còn lại của hình ảnh:

@Override 
public void handleMessage(Message msg) { 
    int currentImage = 0; 
    int nextImage = 0; 
    // Logic to change the images 
    for (ImageView imageView : imageHolders) { 
     currentImage = Integer.parseInt(imageView.getTag().toString()); 
     if (currentImage < 9) { 
      nextImage = currentImage + 1; 
     } else { 
      nextImage = 1; 
     } 
     imageView.setTag("" + nextImage); 
     imageView.setImageResource(getResources().getIdentifier(
       images.get(nextImage - 1), "drawable", 
       "com.beanie.example")); 
    } 
    super.handleMessage(msg); 
} 

Ngoài ra, hãy xem herehere.

+0

Bạn đã thực hiện một ngày của tôi. Chính xác những gì tôi cần. – JehandadK

1

Tôi đã sử dụng số Custom Progress Bar with Round Corners làm nền tảng để khai thác mà Harry Joy đề xuất. Tuy nhiên, nếu bạn muốn có cùng chức năng phiên bản SDK của Android, chẳng hạn như intermediate từ lớp ProgressBar, tôi phải thực hiện một số thay đổi. Những thay đổi tôi đã thực hiện cho phép một bản vẽ trung gian có thể được xác định và hoạt ảnh.

Hãy chắc chắn rằng bạn làm theo các hướng dẫn here, nhưng thay thế các lớp RoundProgress với điều này:

public class RoundProgress extends RelativeLayout { 
private ImageView progressDrawableImageView; 
private ImageView trackDrawableImageView; 
private ImageView backGroundImageView; 
private double max = 100; 
private AttributeSet attrs2 ; 
private Transformation mTransformation; 
private AlphaAnimation mAnimation; 
private int mBehavior; 
private int mDuration; 
private Interpolator mInterpolator; 
private static Context ctx; 
private int bgResource; 

public int getMax() { 
    Double d = new Double(max); 
    return d.intValue(); 
} 

public double getMaxDouble() { 
    return max; 
} 

public void setMax(int max) { 
    Integer maxInt = new Integer(max); 
    maxInt.doubleValue(); 
    this.max = max; 
} 

public void setMax(double max) { 
    this.max = max; 
} 

public RoundProgress(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    inflater.inflate(R.layout.round_progress, this); 
    setup(context, attrs); 
} 

protected void setup(Context context, AttributeSet attrs) 
{ 
    attrs2 = attrs; 
    ctx = context; 
    TypedArray a = context.obtainStyledAttributes(attrs, 
     R.styleable.RoundProgress); 
    //setBackgroundResource(R.drawable.custom_loading_bg); 
    backGroundImageView = (ImageView) findViewById(R.id.background_image_view); 
    backGroundImageView.setBackgroundResource(R.drawable.custom_loading_bg); 


    final String xmlns="http://schemas.android.com/apk/res/com.digiphd.prospec"; 
    bgResource = attrs.getAttributeResourceValue(xmlns, 
      "progressDrawable", 0); 
    progressDrawableImageView = (ImageView) findViewById(
      R.id.progress_drawable_image_view); 

    progressDrawableImageView.setBackgroundResource(bgResource); 

    int trackResource = attrs.getAttributeResourceValue(xmlns, "track", 0); 
    trackDrawableImageView = (ImageView) findViewById(R.id.track_image_view); 
    trackDrawableImageView.setBackgroundResource(trackResource); 

    int progress = attrs.getAttributeIntValue(xmlns, "progress", 0); 
    setProgress(progress); 
    int max = attrs.getAttributeIntValue(xmlns, "max", 100); 
    setMax(max); 

    int numTicks = attrs.getAttributeIntValue(xmlns, "numTicks", 0); 

    a.recycle(); 

    ProgressBarOutline outline = new ProgressBarOutline(context); 
    //addView(outline); 


} 

public void setProgress(Integer value) 
{ 
    setProgress((double) value); 
} 

public void setProgress(double value) { 
    ClipDrawable drawable = (ClipDrawable) 
      progressDrawableImageView.getBackground(); 
    double percent = (double) value/ (double)max; 
    int level = (int)Math.floor(percent*10000); 

    drawable.setLevel(level); 
} 

public void setIntermediate(boolean t) 
{ 
    if(t){ 
     progressDrawableImageView.setBackgroundResource(R.drawable.custom_intermediate_bg); 
     startAnimation(); 
    }else{ 
     progressDrawableImageView.clearAnimation(); 
     progressDrawableImageView.setBackgroundResource(bgResource); 

    } 
} 

/** 
* <p>Start the indeterminate progress animation.</p> 
*/ 
void startAnimation() { 
    int visibility = getVisibility(); 
    if (visibility != VISIBLE) { 
     return; 
    } 
    Log.d("INTERMEDIATE","ANIMATION START!"); 
    mDuration = 1000; 

     if (mInterpolator == null) { 
      mInterpolator = new LinearInterpolator(); 
     } 

     mTransformation = new Transformation(); 
     mAnimation = new AlphaAnimation(0.0f, 1.0f); 
     mAnimation.setRepeatMode(Animation.REVERSE); 
     mAnimation.setRepeatCount(Animation.INFINITE); 
     mAnimation.setDuration(mDuration); 
     mAnimation.setInterpolator(mInterpolator); 
     mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); 
     progressDrawableImageView.startAnimation(mAnimation); 


} 
} 

Bây giờ trong hoạt động của bạn, bạn chỉ có thể gọi .setIntermediate (true hoặc false) khi có yêu cầu.

Các vấn đề liên quan