ShapeDrawable,Style,AlertDialog

ShapeDrawable

用來(lái)自定義一些樣式,如按鈕點(diǎn)擊按下,CheckBox的選擇,進(jìn)度條的背景和進(jìn)度等。

Shape 標(biāo)簽
可以用來(lái)定義邊框,圓角,梯度漸變色。
一般用于Button,或Layout背景。

shape:指定形狀
  矩形:rectangle
  橢圓:oval
  橫線:line
  圓環(huán):ring

solid:指定shape中填充的顏色

stroke:指定shape的邊框
  描邊的顏色:android:color
  描邊的寬度:android:width
  組成虛線的線段的寬度:android:dashWidth
  組成虛線的線段之間的間隔: android:dashGap

corners:指定矩形四個(gè)角的圓角程度
  給四個(gè)角設(shè)置相同的角度:android:radius
  設(shè)定左下角的角度:android:bottomLeftRadius
  設(shè)定右下角的角度:android:bottomRightRadius
  設(shè)定左上角的角度:android:TopLeftRadius
  設(shè)定右上角的角度:android:TopRightRadius

gradient:指定填充顏色的漸變
  漸變類別:android:type 
  linear(線性漸變)、radial(徑向漸變)、sweep(掃描線漸變,默認(rèn)為linear 

  漸變的角度:android:angle
  默認(rèn)為0,其值必須是45的倍數(shù),0表示從左到右,90表示從下到上
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >

    <solid android:color="#C1C1C1" />

    <stroke
        android:width="8dp"
        android:color="#000"
        android:dashGap="2dp"
        android:dashWidth="3dp"
        />

    <corners android:radius="4dp" />

    <gradient
        android:type="linear"
        android:centerColor="@color/colorPrimary"
        android:endColor="@color/colorPrimaryDark"
        android:startColor="@color/colorAccent" />

</shape>
效果
selector 標(biāo)簽
用來(lái)控制選中按鈕狀態(tài)的改變
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <shape>
            <solid android:color="#EEEEE0" />
            <corners android:radius="4dp" />
        </shape>
    </item>

    <item>
        <shape>
            <solid android:color="#FFEBCD" />
            <corners android:radius="4dp" />
        </shape>
    </item>
</selector>

控制按鈕文本按下后的狀態(tài)改變
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#EE0000"/>
    <item android:color="#E9967A"/>
</selector>
效果
CheckBox選中狀態(tài)的改變
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 一定是選中的在前,未選中的在后,用state_checked標(biāo)記 -->
    <item android:state_checked="true"
        android:drawable="@drawable/more_radio_selected" />
    
    <item android:drawable="@drawable/more_radio_normal"/>
</selector>

引用
<CheckBox
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:button="@drawable/check_demo" />
layer-list 標(biāo)簽

陰影效果,重要!

進(jìn)度條背景進(jìn)度的改變
<?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:drawable="@drawable/progress_bar_bg"/>
    
    <item
        android:id="@android:id/progress"
        android:drawable="@drawable/progress_bar_selected_bg"/>

</layer-list>

引用
   <ProgressBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="80"
        style="?android:attr/progressBarStyleHorizontal"
        
        android:progressDrawable="@drawable/layer_demo" />

幀動(dòng)畫

選擇 animation-list 標(biāo)簽
AndroidStudio下只有在 Drawable 文件夾下有選擇。

<?xml version="1.0" encoding="utf-8"?>
<!-- 劇本,沒(méi)有提示純手寫  oneshot設(shè)置只播放一次還是循環(huán)播放 -->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true" >

    <!-- 每一幀需要播放什么圖片 持續(xù)多少時(shí)間-->
    <item
        android:drawable="@drawable/girl_1"
        android:duration="200"/>

    <item
        android:drawable="@drawable/girl_2"
        android:duration="200"/>
</animation-list>

在控件引用
 <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:src="@drawable/animation_demo" />
代碼控制開(kāi)啟動(dòng)畫
private void AlertDemo() {
        btn = (Button) findViewById(R.id.btn);
        img = (ImageView) findViewById(R.id.img);
        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                
                //getDrawable()拿到圖片src
                AnimationDrawable anim = (AnimationDrawable) img.getDrawable();
                anim.start();
            }
        });
    }

風(fēng)格與主題

統(tǒng)一管理View的風(fēng)格和系統(tǒng)的主題樣式

在values下的styles操作

操作控件樣式

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 將共同的樣式抽取出來(lái) -->
    <style name="BaseTheme">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <!-- parent繼承抽取出來(lái)的樣式 -->
    <style name="DemoTheme" parent="BaseTheme">
        <item name="android:text">@string/hello_world</item>
    </style>
</resources>

在Layout.xml中引用設(shè)定的樣式
<TextView style="@style/DemoTheme" />
如果想修改App整體的樣式風(fēng)格

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
  <!-- 自定義App整體風(fēng)格,注意name的命名空間是android: -->
    <style name="CustomAppTheme">
        <item name="android:background">@android:color/darker_gray</item>
    </style>
</resources>

在AndroidManifest.xml的Theme中引用樣式
<android:theme="@style/CustomAppTheme" />

AlertDialog

普通對(duì)話框

private void showDialog() {

        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("標(biāo)題")
                .setMessage("提示消息")
                .setIcon(R.mipmap.ic_launcher_round)
                .setPositiveButton("確認(rèn)", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setNeutralButton("其他", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                })
                .create();

        dialog.show();
    }
private void showDialog() {

        final String[] options = {"item1", "item2", "item3"};

        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("單選")
                .setSingleChoiceItems(options, 0, 
                        new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        
                        String item = options[which];
                        Toast.makeText(mContext, item, Toast.LENGTH_SHORT).show();
                    }
                })
                .create();

        dialog.show();
    }
private void showDialog() {

      final String[] options = {"item1", "item2", "item3"};
      final boolean[] isCheck = {true, false, false};

      AlertDialog dialog = new AlertDialog.Builder(this)
              .setTitle("多選")
              .setMultiChoiceItems(options, isCheck,
                      new DialogInterface.OnMultiChoiceClickListener() {
                          @Override
                          public void onClick(DialogInterface dialog, 
                                              int which, boolean isChecked) {
                                
                              isCheck[which] = isChecked;
                          }
                      })
              .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      String resCheck = "";
                      for (int i = 0; i < isCheck.length; i++) {
                          if (isCheck[i]) {
                              resCheck += options[i] + "\r\n";
                          }
                      }
                      Toast.makeText(mContext, resCheck, Toast.LENGTH_SHORT).show();
                  }
              })
              .create();

      dialog.show();
}
進(jìn)度條對(duì)話框

    private void showDialog() {
        final ProgressDialog dialog = new ProgressDialog(this);
//        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//        dialog.setMax(100);
//        dialog.setProgress(100);
//        dialog.setSecondaryProgress(80);
//        dialog.setCancelable(false);
        dialog.setMessage("提示信息");
        dialog.show();
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                dialog.dismiss();
            }
        }, 2000);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容