自定義android ProgressDialog

oktua689 8年前發布 | 11K 次閱讀 Android開發 移動開發

來自: http://blog.csdn.net//guijiaoba/article/details/19288461


Android系統自己提供的UI的都是比較難看的,開發中經常用到自定義對話框,下面分享個最近項目中使用的加載框。 

 


下面是源代碼,主要的原理就是準備幾個圖片,然后循環播放。

MainActivity.java

package com.example.testandroidprogressdialog;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    Button button1;
    Button button2;

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

        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    public void onClick(View v) {
        if (v == button1) {
            showDialog("正在加載請稍后");
        } else if (v == button2) {
            showDialog("");
        }
    }

    void showDialog(String msg) {
        MyProgressDialog myDialog = new MyProgressDialog(this);
        myDialog.setMsg(msg);
        myDialog.show();
    }
}


MyProgressDialog.java

package com.example.testandroidprogressdialog;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.DialogInterface.OnShowListener;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class MyProgressDialog extends Dialog implements OnShowListener, OnDismissListener {
    Context context;

    ImageView imageview;
    TextView textView;

    String msg;

    public MyProgressDialog(Context context) {
        this(context, R.style.AppTheme_Dialog_NoTitleBar);
    }

    public MyProgressDialog(Context context, int theme) {
        super(context, theme);
        this.context = context;
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = View.inflate(context, R.layout.dialog_progress, null);

        setContentView(view);

        imageview = (ImageView) view.findViewById(R.id.iv_loading);
        textView = (TextView) view.findViewById(R.id.tv_msg);
        setOnShowListener(this);

        textView.setText(msg);
        textView.setVisibility(TextUtils.isEmpty(msg) ? View.GONE : View.VISIBLE);
    }

    public void onShow(DialogInterface dialog) {
        AnimationDrawable animationDrawable = (AnimationDrawable) imageview.getBackground();
        animationDrawable.start();
    }

    public void onDismiss(DialogInterface dialog) {
        AnimationDrawable animationDrawable = (AnimationDrawable) imageview.getBackground();
        animationDrawable.stop();
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}


對話框的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_progress_bg"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/iv_loading"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@anim/dialog_progress_anim_bg"
        android:contentDescription="@string/app_name" />

    <TextView
        android:id="@+id/tv_msg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:textColor="#fff"
        android:textSize="16sp"
        android:visibility="gone" />

</LinearLayout>

還有比較重要的就是,對話框需要的樣式。

<style name="AppTheme.Dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">false</item>
    </style>

    <style name="AppTheme.Dialog.NoTitleBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@drawable/dialog_frame_bg</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

動畫文件

<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/progress_1" android:duration="200"/>
    <item android:drawable="@drawable/progress_2" android:duration="200"/>
    <item android:drawable="@drawable/progress_3" android:duration="200"/>
    <item android:drawable="@drawable/progress_4" android:duration="200"/>
    <item android:drawable="@drawable/progress_5" android:duration="200"/>
    <item android:drawable="@drawable/progress_6" android:duration="200"/>
    <item android:drawable="@drawable/progress_7" android:duration="200"/>
    <item android:drawable="@drawable/progress_8" android:duration="60"/>
</animation-list>

原理和實現都是比較簡單。主要是自定義一個view,可以播放對動畫的圖片,也就是一個幀動畫。然后重裝定義對話框的樣式,不讓系統的樣式和樣式出現,最后在顯示的時候,播放動畫。


下面是下載文件地址http://download.csdn.net/detail/xia215266092/6926849

 本文由用戶 oktua689 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!