Как добавить наследованный от SurfaceView класс в макет
от samogost
В этой статье я научу вас как добавить в макет обьект класса, наследованного от SurfaceView. Многие не знают как правильно использовать класс, наледованный от абстрактного класса SurfaceView в своих играх и делают это вот так:
С первого взгляда нет ничего страшного в этом способе работы с поверхностью. Но если нам нужно создать макет и описать в нем элемент MySurfaceView, да так чтобы дополнительно вместе с ним в разметку добавить несколько игровых кнопок, то многие начинающие программисты для андроид не находят информации как это сделать. Я тоже не нашел ни в одной книжке и статье про андроид такой информации, поэтому решил написать эту статью, которая будет эксклюзивной в своем роде на просторах российского интернета.
В андроиде есть уникальная возможность использовать классы, которые принадлежат семейству классов View, в xml-файлах с разметкой.
Итак, для того чтобы использовать наследованный от SurfaceView класс в макете, надо в дополнение к конструтору с одним параметром (Context context) добавить дополнительный конструктор с параметрами (Context context, AttributeSet attrs), что позволит работать с классом в макете.
После того как вы обьявили этот конструктор , то можно добавлять элемент нашего класса в разметку таким образом:
Первая строка содержим имя класса с полным указанием пакета, второй и третий параметр-обязательные, они отвечают за ширину и высоту нашей поверхности.
Вот пример добавления поверхности в макет:
**Содержимое класса MySurface**
**Содержимое макета**
- public class MainActivity extends Activity {
- public void onCreate(Bundle bundle){
- super.onCreate(bundle);
- MySurfaceView msv=new MySurfaceView(this);
- setContentView(msv);
- }
- }
С первого взгляда нет ничего страшного в этом способе работы с поверхностью. Но если нам нужно создать макет и описать в нем элемент MySurfaceView, да так чтобы дополнительно вместе с ним в разметку добавить несколько игровых кнопок, то многие начинающие программисты для андроид не находят информации как это сделать. Я тоже не нашел ни в одной книжке и статье про андроид такой информации, поэтому решил написать эту статью, которая будет эксклюзивной в своем роде на просторах российского интернета.
В андроиде есть уникальная возможность использовать классы, которые принадлежат семейству классов View, в xml-файлах с разметкой.
Итак, для того чтобы использовать наследованный от SurfaceView класс в макете, надо в дополнение к конструтору с одним параметром (Context context) добавить дополнительный конструктор с параметрами (Context context, AttributeSet attrs), что позволит работать с классом в макете.
После того как вы обьявили этот конструктор , то можно добавлять элемент нашего класса в разметку таким образом:
- <имя_пакета.класс
- layout_width:"match_parent"
- layout_height:"match_parent"
- />
Первая строка содержим имя класса с полным указанием пакета, второй и третий параметр-обязательные, они отвечают за ширину и высоту нашей поверхности.
Вот пример добавления поверхности в макет:
**Содержимое класса MySurface**
- package com.samodelkin;
- import android.content.Context;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
- public MySurface(Context context) {
- super(context);
- }
- public MySurface(Context context, AttributeSet attrs) {
- super(context,attrs);
- }
- public void surfaceCreated(SurfaceHolder holder) {
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- }
- }
**Содержимое макета**
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- >
- <com.samodelkin.MySurface
- android:id="@+id/game_surface"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
- </LinearLayout>