Отображение элементов (Button) в SurfaceView

Интерфейс, диалоги, темы, стили, меню
Ответить
tolik777
Сообщения: 37
Зарегистрирован: 06 июл 2012, 14:25

Отображение элементов (Button) в SurfaceView

Сообщение tolik777 » 14 июл 2013, 15:07

Полгода назад мучался с одной нестандартной проблемой, но не победил. В итоге забросил... Сейчас встала необходимость вернуться, сижу второй день, пробую разные варианты, но никак не могу победить... Сразу скажу, что я не разработчик Android, могу сделать простое приложение с стандартным активити, текстом и т.п., в общем на уровне школьника. Купил на озоне даже 2 книги, одну по Android (не очень хорошая оказалась), а вторая по Java, но там моей проблемы нет.
В общем задумка такая: есть приложение, которое отображает на экране устройства MJPEG поток по http с камеры. В общем сам код я нашел здесь, код вполне рабочий. Мне необходимо на экран добавить кнопки, причем определенным образом их разместить.

1. Вначале, как мне где-то советовали полгода назад я добавил кнопки, создаваемые динамически в приложении, как-то так:
[syntax=java]
public class CxemCAR2Activity extends Activity {
private static final String TAG = "CxemCAR2";

private MjpegView mv;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

String URL = "http://iris.not.iac.es/axis-cgi/mjpg/vi ... on=320x240";

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

mv = new MjpegView(this);
setContentView(mv);


final Button moveUP = new Button(this);
moveUP.setText("Up");
addContentView(moveUP, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
moveUP.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(getBaseContext(), "up", Toast.LENGTH_SHORT).show();
}
});

TextView tv = new TextView(this);
tv.setText("TextView");
addContentView(tv, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

new DoRead().execute(URL);
}
...
...
[/syntax]
Проблема в том, что элементы накладываются друг на друга. Пробовал задавать параметры с отступами, но ничего не получалось.

2. Затем наткнулся на второй вариант на сайте StackOverFlow с похожей проблемой: how to return an object into a surface view android
Похоже, что человек решил свою проблему, но не очень подробно отписался. Пробую реализовать его код, но приложение крашится и в логах толком ничего нет. Подозреваю, что я что-то не так делаю с файлом ресурса, то ли я не так прописал Vid, толи проблема в ViewGroup (про которую я вообще ничего не понял).
В общем код мой такой:
[syntax=java]
public class CxemCAR2Activity extends Activity {
private static final String TAG = "CxemCAR2";

private MjpegView mv;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

String URL = "http://iris.not.iac.es/axis-cgi/mjpg/vi ... on=320x240";

requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

mv = new MjpegView(this); // setContentView(R.layout.activity_main);
View stolenView = mv;

// set your own view
setContentView(R.layout.cxemcar2activity);
View view =(findViewById(R.id.Vid));
((ViewGroup) view).addView(stolenView);

new DoRead().execute(URL);
}
[/syntax]

Код XML-файла активити такой:
[syntax=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"
>

<com.wificam.cxemcar2.MjpegView
android:id="@+id/Vid"
android:layout_width="fill_parent"
android:layout_height="100dip"
android:layout_weight="1"
/>

<TextView
android:text="Test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/Text1"
android:layout_marginBottom="30dp">
</TextView>

</LinearLayout>
[/syntax]

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: Отображение элементов (Button) в SurfaceView

Сообщение xr0m » 14 июл 2013, 20:46

ну.. в первом все понятно, ты им не даешь координаты, они и накладываются один на другой.
во-втором просто каша... отвечаю, только потому, что ты постарался описать проблему )

строку 14,15,19,20 удаляй. Кнопки добавляй в хмл там, где тебе хочется.

Если через код, тогда строку 19 верни и добавляй кнопки через addView, но вернешься к проблеме про кучу. Потому добавляй группой - сначала слой, а в него кнопки.

tolik777
Сообщения: 37
Зарегистрирован: 06 июл 2012, 14:25

Re: Отображение элементов (Button) в SurfaceView

Сообщение tolik777 » 15 июл 2013, 09:15

Спасибо! Разобрался. Описал все в XML.
А правильный код все же такой оказался:
[syntax=java] mv = new MjpegView(this); // setContentView(R.layout.activity_main);
View stolenView = mv;

// set your own view
setContentView(R.layout.cxemcar2activity);
View view =(findViewById(R.id.Vid));
((ViewGroup) view).addView(stolenView);[/syntax]

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: Отображение элементов (Button) в SurfaceView

Сообщение xr0m » 15 июл 2013, 23:38

Хм.. зависит от того, что у тебя в MjpegView. Если прописать что-то такое:

public class MjpegView extends SurfaceView implements SurfaceHolder.Callback {

public MjpegView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
getHolder().addCallback(this);

this.setFocusable(true);
...
}
То тогда код заработал бы корректно.

Ответить