安卓中的动态虚线边框

15

如何在Android中创建任意形状的动态虚线或点线边框? 可以使用XML(首选)或以编程方式实现。

请参见下面的图片示例。

alt text


在移动设备上使用它是可取的吗?除了像BLINK标签一样吸引人之外,它还会消耗电池电量。如果这是关于广告的话,那不是让客户满意的方式。 - Pontus Gagge
这符合我的使用情况。这是为了一个图形应用程序,虚线动画边框是遮罩的通用符号。而且,我认为这不会比实时背景消耗更多的电池电量。 - hpique
好的,我怀疑这是出于恶意广告目的。那是一个合理的目的。 - Pontus Gagge
2
合理怀疑。每次我回到这里,我都会认为这个图像是一个横幅广告。而它实际上是我的问题! - hpique
3个回答

19

你是否看过PathEffects API演示?http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/PathEffects.html

它可以准确地生成动画线,并且你只需要将路径调整到视图边缘即可创建边框。例如:

通过你的视图参数或任意形状定义一个路径:

Path path = new Path();
path.addRect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom(), Path.Direction.CW);

然后使用以下代码创建虚线效果的PathEffect:

PathEffect pe = new DashPathEffect(new float[] {10, 5, 5, 5}, phase);

然后将其关联到一个 Paint 对象并绘制:

mPaint.setPathEffect(pe);
canvas.drawPath(path, mPaint);

编辑:动画效果来自于不断改变相位并重新绘制。在API演示中,它在onDraw()方法中调用invalidate()(触发onDraw()...)。


谢谢Antonyt!这正是我在寻找的。可惜它不能在XML中定义。 - hpique
1
其中一个问题是它分配了大量的对象,这将触发垃圾回收并可能导致动画卡顿。您可以通过在某个地方将float[]分配为类成员来避免部分问题。不确定如何避免每次相位更改时分配DashPathEffect,尽管当然您可以通过转换线条自己处理动画。 - mwd
你可以创建一个DashPathEffects数组(大小等于浮点数数组中的最大数字,本例中为10),并重复使用这些效果。至少这是我正在做的事情,但对于PathDashPathEffect效果也是如此。 - Simon Forsberg

0

XML... 我想不可能。但是你可以使用自定义视图或SurfaceView,并自己处理绘图。玩得开心 :)


有没有关于如何在自定义视图或SurfaceView中实现它的指针? - hpique
你可以在每个画布上绘制线条,并且使用的Paint对象可以具有不同的样式。如果你在每一帧之间切换白色线条和黑色虚线上方的线条,或者黑色线条和白色虚线上方的线条,那么你应该能够得到所期望的效果。 - WarrenFaith

0

你可以使用两个9patch图片形成一个背景框架,放在你想呈现的图像文件周围,一个在两个布局中的每一个。这些图片在虚线元素的放置方面会有所不同。快速切换视图(可能需要延迟),你可能会得到想要的效果。但不知道这是否对让用户继续使用应用程序和节省电池有多大帮助...


一个动画可绘制对象中有两个9补丁图像。这可能有效,并且可以通过XML完成。我会尝试一下。 - hpique
不行。九宫格图片不能重复图案,它们只是拉伸图像的一部分。 - hpique
抱歉,我的意思是您需要创建两个9patch格式的图像。您将不得不自己创建这些图案,但是要以这样的方式创建它们,以便如果您快速在它们之间切换,它会产生虚线移动的错觉。 - Adriaan
可以使用动画可绘制对象来实现切换效果。然而,我不明白如何利用9patch图像创建一个与分辨率无关的虚线边框(无论是否为动画)。 - hpique
我认为在这种情况下9patch不会有用,因为没有办法指定它们来平铺他想要的部分。 - smith324

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接