ShapeDrawable,Style,AlertDialog
2017-06-28 本文已影响0人
云承寒
ShapeDrawable
用来自定义一些样式,如按钮点击按下,CheckBox的选择,进度条的背景和进度等。
Shape 标签
可以用来定义边框,圆角,梯度渐变色。
一般用于Button,或Layout背景。
shape:指定形状
矩形:rectangle
椭圆:oval
横线:line
圆环:ring
solid:指定shape中填充的颜色
stroke:指定shape的边框
描边的颜色:android:color
描边的宽度:android:width
组成虚线的线段的宽度:android:dashWidth
组成虚线的线段之间的间隔: android:dashGap
corners:指定矩形四个角的圆角程度
给四个角设置相同的角度:android:radius
设定左下角的角度:android:bottomLeftRadius
设定右下角的角度:android:bottomRightRadius
设定左上角的角度:android:TopLeftRadius
设定右上角的角度:android:TopRightRadius
gradient:指定填充颜色的渐变
渐变类别:android:type
linear(线性渐变)、radial(径向渐变)、sweep(扫描线渐变,默认为linear
渐变的角度:android:angle
默认为0,其值必须是45的倍数,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 标签
用来控制选中按钮状态的改变
<?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>
控制按钮文本按下后的状态改变
<?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选中状态的改变
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 一定是选中的在前,未选中的在后,用state_checked标记 -->
<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 标签
进度条背景进度的改变
<?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 标签
AndroidStudio下只有在 Drawable 文件夹下有选择。
<?xml version="1.0" encoding="utf-8"?>
<!-- 剧本,没有提示纯手写 oneshot设置只播放一次还是循环播放 -->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true" >
<!-- 每一帧需要播放什么图片 持续多少时间-->
<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();
}
});
}
风格与主题
统一管理View的风格和系统的主题样式
在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中引用设定的样式
<TextView style="@style/DemoTheme" />
如果想修改App整体的样式风格
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 自定义App整体风格,注意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("标题")
.setMessage("提示消息")
.setIcon(R.mipmap.ic_launcher_round)
.setPositiveButton("确认", 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();
}
进度条对话框
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);
}