Я сделал очень простой customView, серый прямоугольник с произвольным количеством красных отметок внутри прямоугольника, отмеченного процентами.
public class DemoView extends View {
private ShapeDrawable mDrawable;
private ArrayList<ShapeDrawable> mMarks;
public DemoView(Context context, int[] marks) {
super(context);
int x = 0;
int y = 0;
int width = 100;
int height = 10;
// Timeline Initially empty
mDrawable = new ShapeDrawable(new RectShape());
mDrawable.getPaint().setColor(Color.GRAY);
mDrawable.setBounds(x, y, x + width, y + height);
// Add marks
if (marks != null && marks.length % 2 == 0) {
mMarks = new ArrayList<ShapeDrawable>(marks.length / 2);
ShapeDrawable mark;
for (int i = 1; i < marks.length; i = i + 2) {
mark = new ShapeDrawable(new RectShape());
mark.getPaint().setColor(Color.RED);
mark.setBounds(x + marks[i - 1], y, x + marks[i], y + height);
mMarks.add(mark);
}
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mDrawable.draw(canvas);
if (mMarks != null)
for (ShapeDrawable mark : mMarks)
mark.draw(canvas);
}
}
Однако я не могу понять, как использовать представление. Каждый раз, когда я пытаюсь добавить более одного вида в режиме linearlayout или relativelayout, я вижу только одно из представлений.
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/llayout"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
Код макета:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout) findViewById(R.id.llayout);
demoview = new DemoView(this, new int[]{10,15,35,60});
demoview.setId(ID_NUM++);
ll.addView(demoview);
demoview2 = new DemoView(this, new int[]{0,1,3,6});
demoview2.setId(ID_NUM++);
ll.addView(demoview2);
demoview3 = new DemoView(this, new int[]{25,60});
demoview3.setId(ID_NUM++);
ll.addView(demoview3);
demoview4 = new DemoView(this, new int[]{15,60});
demoview4.setId(ID_NUM++);
ll.addView(demoview4);
}
Результаты в:
Это неправильный путь? Не хватает ли я некоторого очевидного ключа для использования этого представления несколько раз? Если это не правильный маршрут, есть ли другой способ создания пользовательской формы? Возможно, расширение rectShape?
Следуя совету Mibollma, я просмотрел видео выше, видео из Google I/O 2009 об ускорении вашего пользовательского интерфейса.
Эта информация наиболее точно применима два года спустя. Я не только смог ускорить работу с ListViews с помощью ViewHolder, но смог найти ответ на мой вопрос.
При создании настраиваемого представления необходимо переопределить два метода, первый из которых указан выше: onDraw.
Отсутствующий метод? onMeasure(). Более подробную информацию можно найти здесь.