使用Drawable定义一个虚线或虚线矩形框

1.使用Drawable定义虚线或者矩形框

定义一个虚线--在drawable文件夹下创建一个xml文件,名为dash_line,类型为shape,内容为:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">

    <stroke
        android:width="1px"
        android:dashWidth="5dp" android:dashGap="3dp"
        android:color="@color/bg_btn_gray_pre"/>

</shape>

定义一个虚线矩形框--在drawable文件夹下创建一个xml文件,名为bg_dash_storke,类型为shape,内容为:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <stroke
        android:width="1dp"
        android:color="@color/bg_btn_gray_pre"
        android:dashWidth="5dp"
        android:dashGap="3dp"/>

</shape>
在布局文件中使用:两者都是作为view的背景使用:
<View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layerType="software"
        android:background="@drawable/dash_line"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginTop="30dp"
        android:layerType="software"
        android:background="@drawable/bg_dash_storke"/>
效果图:

蓝线是预览时系统的线,灰色的是定义出来的线。
其中width是线的高度,dashWidth是虚线中每个小的实线的宽度,dashGap是虚线的间隔宽度。定义这样的线简单的很。

2.关闭硬件加速

上面的确可以拿到想要的效果,预览正常。但是在运行起来后,发现虚线变成了实线,并不是预览效果中的虚线,原来是硬件加速的问题。Android从3.0以后支持2D图像绘制的硬件加速,但是在使用某些自定义view和Drawable资源时,硬件加速却会出现问题,明明预览效果都出来了,但是运行起来不管是在模拟器上还是在真机上都不会出现想要的效果。具体什么时候出问题说不清楚,有时候出现有时候不出现,但是出现问题时,我们就需要把硬件加速关闭。可以从三个方面来关闭:
1.在清单文件中的application标签下添加属性:
android:hardwareAccelerated="false"
2.一般都是因为某个view有问题,可以在清单文件中在该view所属的Activity标签下添加上面属性。
3.在布局xml文件中使用,给该view添加属性:
android:layerType="software"
layerTpye有三个属性:software、hardware、none,意思很明白,不多说,因为是硬件加速产生的问题,所以我们给其属性software即可。
以上三种方法,任意一种即可,不过还是最后一个比较好,因为一般不会有硬件加速导致这样的问题,所以如果产生了这样的问题,给产生问题的添加属性就可以了。








要在Android中创建一个斜形边框矩形的Drawable,可以自定义一个Drawable类并重写它的draw()方法。 具体步骤如下: 1. 自定义一个Drawable类,继承自ShapeDrawable。 2. 在类的构造函数中,创建一个Path对象和一个Paint对象,并设置好它们的属性。 3. 在类的draw()方法中,使用Path的lineTo()方法绘制出矩形的四个顶点,并使用Canvas的drawPath()方法绘制出矩形的边框。 4. 在类的getPadding()方法中,返回一个Insets对象,用于设置Drawable的padding值。 参考代码如下: ``` public class SkewedRectangleDrawable extends ShapeDrawable { private Path path; private Paint paint; public SkewedRectangleDrawable() { path = new Path(); paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setAntiAlias(true); } @Override public void draw(Canvas canvas) { Rect bounds = getBounds(); path.moveTo(bounds.left, bounds.top); path.lineTo(bounds.right, bounds.top); path.lineTo(bounds.right - bounds.height() / 2, bounds.bottom); path.lineTo(bounds.left + bounds.height() / 2, bounds.bottom); path.close(); canvas.skew(0.5f, 0); canvas.drawPath(path, paint); } @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); invalidateSelf(); } @Override public Insets getPadding() { return new Insets(10, 10, 10, 10); } } ``` 在这个示例中,我们重写了ShapeDrawable的draw()方法,使用Path绘制出斜形边框矩形的路径,并使用Canvas的skew()方法对矩形进行斜切操作,最后使用Canvas的drawPath()方法绘制出矩形的边框。 在getPadding()方法中,我们返回了一个Insets对象,用于设置Drawable的padding值。这里返回的Insets对象表示左边、上边、右边、下边的padding值均为10px。 你可以在布局文件中使用这个Drawable,例如: ``` <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/skewed_rectangle_drawable" /> ``` 这样就可以在ImageView中显示一个斜形边框矩形了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值