Хорошо, я не мог понять, как правильно говорить об этом, поэтому я предлагаю его как "Как бы вы?".
У меня есть приложение, которое подключается к службе, которая связывает все данные с одним основным действием. Активность разделяется на два скользящими выдвижными ящиками. К верхней части выдвижной деятельности относятся только некоторые кнопки, которые помогают настроить приложение и действовать как основное меню, чтобы быстро добраться в любом месте.
Нижняя часть (открытая щелчком ящика) - это сердце приложения, окно 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...
Вы можете использовать обычный макет для создания виджетов. Если ваши виджеты могут быть совершенно сложными, это, безусловно, лучше всего.
Но OpenGL ничего не может сделать с макетами Android, так что вы делаете для каждого виджета:
View.draw(Canvas)
).Очевидно, вам нужно только один раз делать # 1, а # 2 и # 3 каждый раз, когда ваш виджет меняет какой-то аспект его отображения.
Я использовал этот подход для приложения Augmented Reality, которое имеет сложные макеты, плавающие на предварительном просмотре камеры, и это работает очень хорошо.
ДОБАВЛЕННЫЙ ПОЗЖЕ:
Вот экранный захват моего наложения OpenGL на фоне предварительного просмотра камеры:
Элементы наложения выводятся в частные растровые изображения с использованием обычного макета:
<?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.