Как спроектировать gridview в gl - PullRequest
1 голос
/ 28 января 2011

Хорошо, я не мог придумать, как выразить это прилично, поэтому я предложу это как «Как бы вы?».

У меня есть приложение, которое подключается к службе, которая связывает все данные с одним основным видом деятельности. Деятельность разделена на две части с помощью выдвижного ящика. В верхней части описываемого действия находятся лишь несколько кнопок, которые помогают настроить приложение и действуют как главное меню, чтобы быстро добраться куда угодно.

Внизу (при щелчке по ящику) находится сердце приложения, окно gl, отображающее 9 скамей, содержащих по 6 виджетов в каждой. Виджеты отображают полезные данные и должны иметь возможность свободно перемещаться и долго щелкать, чтобы открыть меню параметров.

В этом и заключается моя проблема: я использовал вид сетки для хранения виджетов, но теперь, когда я использую GL для скамей и слушателя касания, я не знаю, как наложить вид сетки на скамейки и по-прежнему сохраняйте движение касания для окна GL И по-прежнему сможете взаимодействовать с видом сетки.

Это заставляет меня спрашивать чье-либо мнение о том, как это сделать. На данный момент единственный вариант, который у меня есть, это выяснить, как сделать ВСЕ виджеты (даже если некоторые из них могут быть даже гистограммой) в gl. Я бы предпочел не делать этого, потому что я не очень хорошо работаю друг с другом. Но я действительно не могу понять, как интегрировать эти функции и при этом сделать их функциональными. Есть идеи?!

ПРЕОБРАЗОВАНИЕ GRIDVIEW В BITMAP

Этот метод в моем расширении gridview (WorkBench). По сути, я делаю обход массива видов сетки, собирая растровые изображения каждого вида, а затем устанавливая растровое изображение в качестве текстуры для панелей.

ToBitmap из класса WorkBench

public Bitmap toBitmap() {
    int x = getWidth();
    int y = getHeight();
    Bitmap b = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas();
    canvas.setBitmap(b);
    draw(canvas);
    return b;
}

А вот где я запускаю WorkBenches

LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
for (int i = 0; i < mWB.length; i++) {
    mWB[i] = mBoundService.createBench(ARMHomescreen.this, i+"");
    mWB[i].setLayoutParams(lp);
}

Что происходит, так это то, что размеры WorkBenches никогда не устанавливаются, независимо от того, использую ли я LayoutParam или задаю размер в методе toBitmap ...

1 Ответ

3 голосов
/ 31 января 2011

Вы можете использовать обычный макет для оформления ваших виджетов. Если ваши виджеты вообще могут быть сложными, это, безусловно, лучшее, что нужно сделать.

Но OpenGL ничего не может сделать с макетами Android, так что вы делаете для каждого виджета:

  1. накачайте приватный вид, содержащий макет вашего виджета.
  2. Заполните ваш виджет значениями, которые будут отображаться (текст и т. Д.)
  3. Важный бит: нарисуйте свой виджет в частное растровое изображение (используя View.draw(Canvas)).
  4. Преобразование вашего растрового изображения в текстуру GL для рендеринга GL

Очевидно, что вам нужно только сделать # 1 один раз, а # 2 и # 3 каждый раз, когда ваш виджет меняет некоторые аспекты своего отображения.

Я использовал этот подход для приложения дополненной реальности, которое имеет сложные макеты, плавающие в окне предварительного просмотра камеры, и оно действительно работает очень хорошо.

ДОБАВЛЕНО ПОЗЖЕ:

Вот снимок экрана моего наложения OpenGL на фоне предварительного просмотра камеры:

enter image description here

Элементы наложения отображаются в частные растровые изображения с использованием обычной компоновки:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="vertical"
    android:layout_width="200dp"
    android:layout_height="80dp" 
    android:background="@drawable/ar_regus_frame">

<TextView    
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:singleLine="false"
    android:textColor="@android:color/black"
    android:textSize="16sp"
    android:textStyle="bold"
    android:shadowColor="@android:color/white"
    android:shadowDx="0"
    android:shadowDy="1" 
/>

<TextView    
    android:id="@+id/distance"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="6dp"
    android:background="@drawable/bkgnd_red_field"
    android:textColor="@android:color/white"
    android:textSize="16sp"
    android:textStyle="bold" 
/>

</RelativeLayout>

С помощью этой техники вы наслаждаетесь лучшим из обоих миров ... вы получаете возможность использовать удивительно мощную систему разметки Android для разработки сложных элементов пользовательского интерфейса и рендеринга их со скоростью и плавностью аппаратного ускорения OpenGL.

ДОБАВЛЕНО 3 ФЕВРАЛЯ 2011 11:56 утра ИШ

Вот как вы рисуете представление для частного растрового изображения:

// Inflate the view
View view = getLayoutInflater().inflate(R.layout.whatever, null);

// HERE YOU SET ALL YOUR VIEW AND CHILD VIEW PROPERTIES, TEXT ETC
// eg view.findViewById(R.id.foo).setSomeProperty(etc);

// Now we set the desired pixel size of our view. This is something the framework
// would normally do for you, as a result of the view being attached to the
// Window's view hierarchy. Since *this* view is *not* attached to the Window, we
// have to do it manually
// NB: omitted DP to pixels conversion for clarity
view.setLayoutParams(new LayoutParams(160, 160))); 
view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int width  = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
view.layout(0, 0, width, height);

// Finally we draw our view to a private bitmap
Canvas canvas = new Canvas();
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
view.draw(canvas);

// The bitmap can now be converted to a GL texture in the normal way. 
...