понедельник, 10 августа 2015 г.

Пишем игру для Андроид

Часть третья. Установка кнопки с переходом на второе активити
Решим для себя, какую мы хотим видеть кнопку. Наша кнопка будет оригинальной и находиться по центру нижней части экрана на главном активити. При нажатии кнопка будет менять цвет и запустит переход на новое активити.


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


 Теперь нужно решить проблему расположения кнопки. Она в том, что на разных экранах наша кнопка должна располагаться примерно в одном и том же месте относительно заднего фона. Я воспользовался методом разметки TableLayout. Фактически мы разобьем экран на 9 прозрачных ячеек (3 строки и 3 столбца). В 8 ячейку вставим изображение светлой кнопки.
Но прежде, давайте создадим второе активити, на которое будем переходить при нажатии кнопки. Для этого наведите мышку на папку java, кликните правой кнопкой.



В выпадающем меню двигаемся по пути New>Activity>Blank Activity. Кликаем левой кнопкой. Нам открывается окно, в котором мы можем назвать наше активити SecondActivity.




Нажимаем Finish. Наше активити создано, также автоматически прописано в манифесте, созданы для него лэйаут и меню ресурсов.
Пора разместить кнопки. Скопируем их изображения и вставим в папку drawable как btn1(светлая) и  btn2(темная).

 Теперь займемся activity_main.xml.
Поверх нашего фона вставляем еще один слой в виде таблицы TableLayout.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
xmlns:tools="http://schemas.android.com/tools"
    
android:layout_width="match_parent"
    
android:layout_height="match_parent"
    
tools:context=".MainActivity"
    
android:background="@android:color/black">
    />

    <
ImageView
        
android:layout_width="match_parent"
        
android:layout_height="match_parent"
        
android:id="@+id/imageView1"
        
android:layout_gravity="center"
        
android:scaleType="fitXY"
        
android:src="@drawable/moon_base"
        
android:contentDescription="@string/bg"
        
/>
    <
TableLayout
        
android:layout_width="fill_parent"
        
android:layout_height="fill_parent"
        
android:stretchColumns="*"
        
>
        <
TableRow
            
android:layout_weight="1"
            
android:gravity="center">
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn1" />

            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn2" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn3" />
        </
TableRow>
        <
TableRow
            
android:layout_weight="1"
            
android:gravity="center">
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn4" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn5" />
                />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn6" />
                />

        </
TableRow>
        <
TableRow
            
android:layout_weight="1"
            
android:gravity="center">
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn7" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:id="@+id/image_button8"
                
android:background="@android:color/transparent"
                
android:src="@drawable/btn1"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:contentDescription="@string/btn8"
                
android:padding="10dp" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn9" />
                />

        </
TableRow>

    </
TableLayout>
</FrameLayout>
Каждой ячейке мы дали «имя» от btn1 до btn9. Их также нужно прописать в строковых ресурсах.
Все ячейки прозрачны (android:background="@android:color/transparent")и пусты, кроме btn8 (android:src="@drawable/btn1").
В режиме дизайна можем проконтролировать, как разбит экран на ячейки.


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

Делаем кнопку активной. В MainActivity.java после строки
setContentView(R.layout.activity_main);
пишем следующее:
Создаем ImageButton объект с именем imgbtn8, и подключаем к нему чувствительность к касанию с помощью метода setOnClickListener . Теперь при касании данной области экрана будет происходить два события метода onClick.
Во-первых, будет выводиться новое изображение кнопки btn2 (по умолчанию мы в разметке назначили  btn1.
Во-вторых, с помощью намерения по имени intent8 (по названию кнопки) и метода startActivity мы переходим на новое активити SecondActivity .

final ImageButton imgbtn8 = (ImageButton)findViewById(R.id.image_button8);

imgbtn8.setOnClickListener(
new View.OnClickListener()
{

    
public void onClick(View v)
    {
        
// меняем изображение кнопки делаем переход на SecondActivity

        
imgbtn8.setImageResource(R.drawable.btn2);
        Intent intent8 = 
new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent8);
    }
});
Посмотрим, как выглядит наша кнопка на разных устройствах.

Теперь проверим её работоспособность. Для этого я сделал маленькое видео.

В следующей статье мы рассмотрим проблемы создания игрового цикла и создадим первый игровой объект.

Ссылка на скачивание изображений кнопок.

Файлы приложения на данный момент.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
    
package="com.adc2017gmail.moonbase" >

    <
application
        
android:allowBackup="true"
        
android:icon="@mipmap/ic_launcher"
        
android:label="@string/app_name"
        
android:theme="@style/AppTheme" >
        <
activity
            
android:name=".MainActivity"
            
android:label="@string/app_name"
            
android:screenOrientation="portrait" >
            <
intent-filter>
                <
action android:name="android.intent.action.MAIN" />

                <
category android:name="android.intent.category.LAUNCHER" />
            </
intent-filter>
        </
activity>
        <
activity
            
android:name=".SecondActivity"
            
android:label="@string/title_activity_second" >
        </
activity>
    </
application>

</
manifest>

MainActivity.java

package com.adc2017gmail.moonbase;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.MenuItem;import android.view.View;import android.widget.ImageButton;public class MainActivity extends Activity {

    
@Override
    
protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main);

        
final ImageButton imgbtn8 = (ImageButton)findViewById(R.id.image_button8);

        imgbtn8.setOnClickListener(
new View.OnClickListener()
        {

            
public void onClick(View v)
            {
                
// меняем изображение кнопки делаем переход на SecondActivity

                
imgbtn8.setImageResource(R.drawable.btn2);
                Intent intent8 = 
new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent8);
            }
        });
    }


    
@Override
    
public boolean onOptionsItemSelected(MenuItem item) {
        
// Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        
int id = item.getItemId();

        
//noinspection SimplifiableIfStatement
        
if (id == R.id.action_settings) {
            
return true;
        }

        
return super.onOptionsItemSelected(item);
    }
}

SecondActivity.java

package com.adc2017gmail.moonbase;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class SecondActivity extends ActionBarActivity {

    
@Override
    
protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.
activity_second);
    }

    
@Override
    
public boolean onCreateOptionsMenu(Menu menu) {
        
// Inflate the menu; this adds items to the action bar if it is present.
        
getMenuInflater().inflate(R.menu.menu_second, menu);
        
return true;
    }

    
@Override
    
public boolean onOptionsItemSelected(MenuItem item) {
        
// Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        
int id = item.getItemId();

        
//noinspection SimplifiableIfStatement
        
if (id == R.id.action_settings) {
            
return true;
        }

        
return super.onOptionsItemSelected(item);
    }
}

strings.xml
<resources>
    <
string name="app_name">MoonBase</string>

    <
string name="hello_world">Hello world!</string>
    <
string name="action_settings">Settings</string>
    <
string name="bg">background</string>
    <
string name="btn1">btn1</string>
    <
string name="btn2">btn2</string>
    <
string name="btn3">btn3</string>
    <
string name="btn7">btn7</string>
    <
string name="btn8">btn8</string>
    <
string name="title_activity_second">SecondActivity</string>
    <
string name="btn4">btn4</string>
    <
string name="btn5">btn5</string>
    <
string name="btn6">btn6</string>
    <
string name="btn9">btn9</string>
</
resources>

ativity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
xmlns:tools="http://schemas.android.com/tools"
    
android:layout_width="match_parent"
    
android:layout_height="match_parent"
    
tools:context=".MainActivity"
    
android:background="@android:color/black">
    />

    <
ImageView
        
android:layout_width="match_parent"
        
android:layout_height="match_parent"
        
android:id="@+id/imageView1"
        
android:layout_gravity="center"
        
android:scaleType="fitXY"
        
android:src="@drawable/moon_base"
        
android:contentDescription="@string/bg"
        
/>
    <
TableLayout
        
android:layout_width="fill_parent"
        
android:layout_height="fill_parent"
        
android:stretchColumns="*"
        
>
        <
TableRow
            
android:layout_weight="1"
            
android:gravity="center">
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn1" />

            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn2" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn3" />
        </
TableRow>
        <
TableRow
            
android:layout_weight="1"
            
android:gravity="center">
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn4" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn5" />
                />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn6" />
                />

        </
TableRow>
        <
TableRow
            
android:layout_weight="1"
            
android:gravity="center">
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn7" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:id="@+id/image_button8"
                
android:background="@android:color/transparent"
                
android:src="@drawable/btn1"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:contentDescription="@string/btn8"
                
android:padding="10dp" />
            <
ImageButton
                
android:layout_width="fill_parent"
                
android:layout_height="fill_parent"
                
android:background="@android:color/transparent"
                
android:scaleType="center"
                
android:adjustViewBounds="true"
                
android:padding="10dp"
                
android:contentDescription="@string/btn9" />
                />

        </
TableRow>

    </
TableLayout>
</
FrameLayout>

  
activity_second.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    
android:paddingRight="@dimen/activity_horizontal_margin"
    
android:paddingTop="@dimen/activity_vertical_margin"
    
android:paddingBottom="@dimen/activity_vertical_margin"
    
tools:context="com.adc2017gmail.moonbase.SecondActivity">

    <
TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        
android:layout_height="wrap_content" />

</
RelativeLayout>

Комментариев нет:

Отправить комментарий