Как спроектировать gridview в gl

1

Хорошо, я не мог понять, как правильно говорить об этом, поэтому я предлагаю его как "Как бы вы?".

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

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

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

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

КОНВЕРТИРОВАНИЕ ГРИДОВИЧЕСКОГО ОБОРОТА В БИТМАЛЕ

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

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...

Теги:
view
opengl-es
design

1 ответ

3
Лучший ответ

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

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

  • Наполните частный вид, содержащий макет виджетов.
  • Заполните свой виджет отображаемыми значениями (текст и т.д.)
  • Критический бит: нарисуйте виджет на личном растровом изображении (используя View.draw(Canvas)).
  • Преобразование растрового изображения в текстуру GL для рендеринга GL

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

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

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

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

Изображение 174551

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

<?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-я FEB 2011 11:56 утра ish

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

// 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 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. 
  • 0
    Это то, о чем я думал, просто создав текстуру виджета и прикрепив ее к плоскости, но я подумал, что это будет дорого с виджетами, которые меняют данные несколько раз в секунду. Как вы думаете, сколько будет стоить создание растрового изображения и изменение текстуры, возможно, 20 раз в секунду?
  • 0
    54 маленьких виджета, которые вместе занимают гораздо меньше, чем обычный экран ... 20 кадров в секунду должны быть легко достижимы. (При условии, что вам не нужно вызывать measure () и layout () каждое изменение). Можете ли вы добавить скриншот ваших виджетов?
Показать ещё 17 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню