说到自定义Drawable,大家一定都会想到使用xml实现,网上Java代码实现的方式也很少,今天我来介绍progressBar的双重背景的xml和Java实现
XML实现:
首先是我们的布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ProgressBar
android:id="@+id/loading_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="400dp"
android:layout_height="6dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="200dp"
android:max="100"
android:progress="30"
android:progressDrawable="@drawable/progressbar_bg"
/>
</RelativeLayout>
Drawable文件夹下定义一个progressbar_bg.xml文件,实现progressBar的双重背景:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="14dp"/>
<solid android:color="#50FFFFFF"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="14dp"/>
<solid android:color="#00DD4D"/>
</shape>
</clip>
</item>
</layer-list>
拓展:
shape标签下的所有子属性:
gradient:设置颜色渐变
solid:设置填充风格
stroke:设置描边宽度
corners:设置圆角
padding:定义内容离边界的距离
Java代码实现:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.vip_hq);
ProgressBar progressBar = findViewById(R.id.loading_bar);
GradientDrawable p=new GradientDrawable();
p.setCornerRadius(10);
p.setColor(Color.rgb(0x00, 0xdd, 0x4d));
ClipDrawable progress = new ClipDrawable(p, Gravity.LEFT, ClipDrawable.HORIZONTAL);
GradientDrawable background = new GradientDrawable();
background.setColor(Color.rgb(0xff, 0xff, 0xff));
background.setAlpha(128);
background.setCornerRadius(10);
LayerDrawable pd=new LayerDrawable(new Drawable[]{background ,progress});
progressBar.setProgressDrawable(pd);
progressBar.setProgress(50);
}
}
至于为什么想用Java代码实现,主要是因为想实现进度带光晕的progressBar,实现方式是自定义一个Drawable替换代码中的第一个GradientDrawable对象,想了解的可以私聊。