ラベル Button の投稿を表示しています。 すべての投稿を表示
ラベル Button の投稿を表示しています。 すべての投稿を表示

2014年4月27日日曜日

【Android、4.x】ボタンがクリックされたときに○○する

※Android4.0以降で確認してます。それ以前で使えるかは調べてません。

ボタンをクリックしたら○○する〜というのを書いてみます。

作ってみる

プロジェクトの作成

新規Androidプロジェクトを適当に

ボタンの配置

デフォルトで作られる"activity_main.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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="HelloWorld" />

</RelativeLayout>
これで画面上にボタンが出来る。

クリックを受け取る

ボタンなどのクリックできるクラスにはsetOnClickListenerというメソッドが用意されてる。(継承元のViewクラスのメソッドだけど。)
このメソッドの引数にView.OnclickListener型のインスタンスを渡せばOK)

やり方は2つ。

1つ目:Activity自身にOnClickListenerを実装する

こんな感じ。
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);  
  
  View btn = findViewById(R.id.btn);
  btn.setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
        Toast.makeText(this, "HelloWorld", Toast.LENGTH_LONG).show();
 }
}
MainActivity自身がView.OnclickListenerインターフェイスを継承することで
setOnClickListenerメソッドの引数に自身(this)を渡してしまおうという作戦。
クリックされたときはMainActivityのonClickが呼ばれる。

2つ目:匿名クラスを使う

MainActivityでOnClickListenerを継承するんじゃなく
メソッド内で名前を持たないクラスを書いてしまう方法
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);  
  
  View btn = findViewById(R.id.btn);
  
  OnClickListener listener = new OnClickListener() {
   @Override
   public void onClick(View v) {
          Toast.makeText(v.getContext(), "HelloWorld", Toast.LENGTH_LONG).show();
   }
  };
  
  btn.setOnClickListener(listener);
 }

}
見やすくするためにlistenerという変数を用意したけど
setOnClickListener()の括弧内に全部書いちゃう事も可能。


どっちがいいんだろうね。
自分は2の方がなんとなく好き。

2014年3月13日木曜日

【Unity,NGUI3.x】新しくなったNGUIでボタンを作成する

NGUIバージョンアップが激しすぎて久々に触ったらボタンすら作れなかった。
(たぶん昨年末のv3.0ぐらいでがらっと変わったはず)
悔しいのでちょっと調べました。
そしたら何コレちょー便利!

バージョン

NGUI v3.5.3
Unity 4.3.4f1

参考サイト

http://www.tasharen.com/forum/index.php?PHPSESSID=df10d9532aaf908e31c9b403acdff090&topic=6708

UIButtonについて

※以下適当に翻訳。
Buttonはマウスホバーやクリックイベントを取得し、対象のSpriteの色を変更するために設計されたシンプルなコンポーネントです。
どんなものでもボタンにできます。それはNGUIのwidgetである必要はありません。
Colliderを持つものであれば何にでもButtonコンポーネントを付けることができます。しかしながら一般的にはNGUIのUI階層にあるUISpriteやゲームオブジェクトに付けることが多いでしょう。

ボタンとして動作させるためには、必ずNGUIのUICameraに映す必要があります。また、Physics設定の"Raycast Hit Triggers"がオンになっている必要があります。

ボタンはマウスオーバー・押下・またクリックイベントを受け取り、Targetフィールドに設定したObjectに対して色の変化を提供します。これらは一般的にwidget(Sprite,Label,またはTexture)を対象としますが、ライトやレンダラを持つその他のObjectにも適用できます。

もしクリックにより別のオブジェクトの関数を呼び出したい場合は”Notify”フィールドに対象となるGameObjectをドラッグ&ドロップします。するとドロップダウンリストに
呼び出し可能な関数が表示されるのでそれを選択します。ここに表示される関数はPublicかつ戻り値がvoidの物だけです。

例)
public void MyClickFunction()
{
    Debug.Log("I was clicked!");
}

Tip1(よくわからん)

It's generally a good idea to put the Button component on the same game object as the button's background sprite. Hit ALT+SHIFT+C to quickly create a collider, and check the "Box Collider" option on the sprite so that the box collider auto-updates as you resize the sprite.

Tip2

UIButtonはOnClick通知だけを提供します。もしOnPress, OnHover, OnSelect, OnDoubleClick など、より高度な通知を行いたければUIEventTriggerコンポーネントを使用してください。

実際にやってみた

・NGUIのアセットをImport
・適当なScene作成
・MainCamera削除
・NGUI->Create->Sprite

・適当に入ってるAtlasとSpriteを選択。
 ここではサンプルのFantasyAtlasとBrightスプライトを選択。
 会わせてSlicedSpriteに設定。

・HierarchyウィンドウでSpriteを選択したまま、NGUI->Attach->Collider
・HierarchyウィンドウでSpriteを選択したまま、NGUI->Attach->Button Script

これだけでボタンになった。

あとはイベントの捕捉。
・下記みたいな適当なスクリプト作成(なんでもいい)
using UnityEngine;

public class TestScript : MonoBehaviour
{
  public void Test_OnHoverOver () { Debug.Log ("Test_OnHoverOver"); }
  public void Test_OnHoverOut () { Debug.Log ("Test_OnHoverOut"); }
  public void Test_OnPress () { Debug.Log ("Test_OnPress"); }
  public void Test_OnRelease () { Debug.Log ("Test_OnRelease"); }
  public void Test_OnSelect () { Debug.Log ("Test_OnSelect"); }
  public void Test_OnDeselect () { Debug.Log ("Test_OnDeselect"); }
  public void Test_OnClickOrTap () { Debug.Log ("Test_OnClickOrTap"); }
  public void Test_OnDoubleClickOrTap () { Debug.Log ("Test_OnDoubleClickOrTap"); }
}
・適当なGameObjectを作って上記スクリプトを追加
・ボタンとなったSpriteのUIButton->Notifyに上記GameObjectをドラッグ
・ドロップダウンにメソッド一覧が現われるので好きなの選択

これだけでイベント拾えるようになりました。

クリック以外を拾いたい場合は
・UIButtonを付けたGameObjectに
 AddComponent->Event Trigger
あとは同じ。


これは使いやすいわ…

Unity系記事まとめ
Related Posts Plugin for WordPress, Blogger...