ShapeDrawable
用來自定義一些樣式,如按鈕點(diǎn)擊按下婴渡,CheckBox的選擇幻锁,進(jìn)度條的背景和進(jìn)度等。
Shape 標(biāo)簽
可以用來定義邊框边臼,圓角哄尔,梯度漸變色。
一般用于Button柠并,或Layout背景岭接。
shape:指定形狀
矩形:rectangle
橢圓:oval
橫線:line
圓環(huán):ring
solid:指定shape中填充的顏色
stroke:指定shape的邊框
描邊的顏色:android:color
描邊的寬度:android:width
組成虛線的線段的寬度:android:dashWidth
組成虛線的線段之間的間隔: android:dashGap
corners:指定矩形四個角的圓角程度
給四個角設(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)簽
用來控制選中按鈕狀態(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" />
幀動畫
選擇 animation-list 標(biāo)簽
AndroidStudio下只有在 Drawable 文件夾下有選擇械哟。
<?xml version="1.0" encoding="utf-8"?>
<!-- 劇本疏之,沒有提示純手寫 oneshot設(shè)置只播放一次還是循環(huán)播放 -->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true" >
<!-- 每一幀需要播放什么圖片 持續(xù)多少時間-->
<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" />
代碼控制開啟動畫
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">
<!-- 將共同的樣式抽取出來 -->
<style name="BaseTheme">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<!-- parent繼承抽取出來的樣式 -->
<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
普通對話框
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)度條對話框
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);
}