2010-08-25 4 views
14

Как вы создаете анимированную пунктирную или пунктирную границу произвольной формы в Android? В XML (желательно) или программно.Анимированная пунктирная граница в Android

См. Рисунок ниже для примера.

alt text

+0

Желательно ли в мобильном устройстве? Помимо того, что он выглядит так же привлекательно, как и тег BLINK, он будет питаться от батареи. Если речь идет о рекламе, это не способ получить счастливых клиентов. –

+0

Желательно для моего использования. Это графическое приложение, а пунктирная граница анимации - универсальный символ маски. Кроме того, я не думаю, что это будет потреблять больше энергии аккумулятора, чем говорят, живой фон. – hpique

+0

ОК, я подозревал, что это нечестные рекламные цели. Это разумная цель. –

ответ

18

Вы видели демо-версию 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); 

EDIT: Анимированный эффект происходит от постоянного изменения фазы и перерисовки. В демо-версии API он вызывает invalidate() в методе onDraw() (который вызывает onDraw() ...)

+0

Спасибо antonyt!Это именно то, что я искал. Жаль, что он не может быть определен в xml. – hpique

+1

Одна из проблем заключается в том, что он выделяет много объектов, которые будут запускать сборку мусора и могут привести к заиканию вашей анимации. Вы можете избежать части проблемы, выделив float [] как член класса где-нибудь. Не уверен, как избежать распределения DashPathEffect каждый раз, когда изменяется фаза, хотя, конечно, вы можете обрабатывать анимацию самостоятельно, переведя строки. – mwd

+0

Вы можете создать массив DashPathEffects (размером, равным наибольшему числу в массиве float, 10 в этом случае) и повторно использовать эти эффекты. По крайней мере, это то, что я делаю, но для эффекта «PathDashPathEffect». –

0

XML ... Я думаю, не представляется возможным. Но вы можете использовать пользовательский вид или SurfaceView и обрабатывать чертеж самостоятельно. Получайте удовольствие от этого :)

+0

Любые указатели для его реализации с пользовательским представлением или SurfaceView? – hpique

+0

вы можете рисовать линии на каждом холсте, а используемый объект Paint может иметь разные стили. Если вы перейдете к белой линии с черной пунктирной линией сверху и черной линией с белой пунктирной линией над каждым кадром, вы должны получить желаемый эффект. – WarrenFaith

0

Не могли бы вы использовать в качестве фонового фрейма вокруг файла изображения, который вы хотите представить, в виде двух изображений из 9 патчей, по одному в каждом из двух макетов. Изображения будут отличаться с точки зрения размещения пунктирных элементов. Быстрое изменение взглядов (возможно, потребуется задержка), и вы можете получить необходимый эффект. Не знаю, насколько эффективно это было бы, если бы можно было позволить пользователю продолжать использовать приложение и жевательную батарею ...

+0

Два 9 патч-изображений в анимационной анимации. Это может работать и выполняется через XML. Попробует. – hpique

+0

Нет. Не работает. 9 патч-изображений не повторяют паттерны, они просто растягивают часть изображения. – hpique

+0

Извините, что я получаю то, что вы создаете два изображения в формате 9patch. Вам придется создавать шаблоны самостоятельно, но таким образом, чтобы, если бы вы быстро переключались между ними, это создавало бы иллюзию, что тире двигались. – Adriaan

Смежные вопросы