2015-12-08 3 views
0

Я пытаюсь сделать вытягиваемый, который выглядит как круг с тенью. Он должен масштабироваться до разных размеров и должен быть нарисован на холсте. Я использую setBounds для установки координат и масштаба.XML-масштабируемый масштаб при рисовании на холсте

Моей вытяжка:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:bottom="0dp" 
     android:left="5dp" 
     android:right="5dp" 
     android:top="10dp"> 
     <shape android:shape="oval"> 
      <size 
       android:width="115dp" 
       android:height="115dp" /> 
      <solid android:color="@color/level_button_dark" /> 
     </shape> 
    </item> 
    <item 
     android:bottom="5dp" 
     android:left="5dp" 
     android:right="5dp" 
     android:top="5dp"> 
     <shape android:shape="oval"> 
      <size 
       android:width="115dp" 
       android:height="115dp" /> 
      <solid android:color="@color/level_button" /> 
     </shape> 
    </item> 
</layer-list> 

Моего рисунок код

mButtonDrawable.setBounds(20, 20, 220, 220); 
mButtonDrawable.draw(canvas); 
mButtonDrawable.setBounds(270, 20, 370, 120); 
mButtonDrawable.draw(canvas); 
mButtonDrawable.setBounds(420, 20, 470, 70); 
mButtonDrawable.draw(canvas); 

Результат:

enter image description here

Я хочу добиться единообразия внешнего вида для всех масштабов. Протестировано на эмуляторе api 18.

ответ

2

В то время как подход @RexSplode действителен, я нашел способ сделать это с помощью одного drawable. Вы просто не должны звонить setBounds() и работать с холстом.

См. Пример ниже.

mButtonDrawable.setBounds(0, 0, mButtonDrawable.getIntrinsicWidth(), mButtonDrawable.getIntrinsicHeight()); 

canvas.save(); 
canvas.translate(20, 20); 
canvas.scale(1, 1); 
mButtonDrawable.draw(canvas); 
canvas.restore(); 

canvas.save(); 
canvas.translate(420, 20); 
canvas.scale(0.5f, 0.5f); 
mButtonDrawable.draw(canvas); 
canvas.restore(); 

canvas.save(); 
canvas.translate(620, 20); 
canvas.scale(0.25f, 0.25f); 
mButtonDrawable.draw(canvas); 
canvas.restore(); 

Результат:

enter image description here

Я получил идею от ImageView source.

0

Проблема в том, что ваши круги связаны с одинаковыми координатами. Так что, когда вы звоните

public void setBounds (int left, int top, int right, int bottom) 

он изменяет координаты, где две окружности должны быть нарисованы, но расстояние между ними должно также стать меньше. Поэтому я предполагаю, что один из доступных не будет. Для каждого круга вам нужны две отдельные чертежи. И измените их границы самостоятельно. Вот как вы можете добиться желаемого эффекта.

+0

Спасибо за ваш ответ, я просто нашел еще лучшее решение. Пожалуйста, проверьте мой ответ. – vyndor

+0

Довольно круто. Я буду помнить об этом! – RexSplode

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