SurfaceViewからActivity中のメソッドを実行する方法

4,110 views
Skip to first unread message

DDNOVEL

unread,
Sep 28, 2011, 7:37:43 PM9/28/11
to Android-SDK-Japan
他のHPなどを参考にしながらコーディングしていますが、
うまくいかず困っています。
どなたか、よろしくお願いします。

以下のように、ActivityからSurfaceViewを呼び出して、その中のonDrawで描写をするような形になっています。

以下で、処理Aのところで、GameActivity.thisを使って処理をする(以下の例では他Activity呼び出し)ことは可能なのです
が、
処理BのタイミングでGameActivity.thisを使うにはどうすればよいのでしょうか?
処理Bで何かを記述して、GameActivity中のメソッドを実行するような方法? があればよさそうなのですが...

public class GameActivity extends Activity{

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

setContentView(new GameView(this));
}

@Override
public boolean onTouchEvent(MotionEvent event) {
/******処理A*****/
//たとえば、アクティビティ表示
Intent intent = new Intent( GameActivity.this, GameBBB.class );
startActivity( intent );

return true;
}
}

class GameView extends SurfaceView implements
SurfaceHolder.Callback,Runnable{
Thread thread;
boolean isAttached;
// 描画用
Paint paint = null;

public GameView(Context context) {
super(context);

getHolder().addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
isAttached=true;
thread = new Thread(this);
thread.start();

// 描画用の準備
paint = new Paint();

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
isAttached = false;
while (thread.isAlive());
}

@Override
public void run() {
while (isAttached) {
doDraw(getHolder());
}
}

private void doDraw(SurfaceHolder holder){
Canvas canvas = holder.lockCanvas();
if (canvas != null)
{
canvas.drawColor(Color.WHITE);
//描写処理
getHolder().unlockCanvasAndPost(canvas);
}
holder.unlockCanvasAndPost(canvas);
/******処理B*****/
}

}

Keiji Ariyama

unread,
Sep 29, 2011, 1:15:42 AM9/29/11
to android-...@googlegroups.com
有山と申します。

 AndroidというよりはJava言語の領分だとは思いますが、、、現在、GameView
でimplementしているSurfaceHolder.Callbackを、GameActivityで実装
(implement)してはどうでしょうか。

--
Keiji,
ml_an...@c-lis.co.jp

mokkouyou

unread,
Sep 29, 2011, 1:25:18 AM9/29/11
to android-...@googlegroups.com
mokkouyouです。

~~~.this
がどういうものなのかの理解は別として、

コンストラクタで、該当ActivityをContextとして受け取っているので、
キャストして使えばいいのではないでしょうか。

GameActivity mGameActivity;
public GameView(Context context) {
super(context);
this.mGameActivity = (GameActivity)context;
getHolder().addCallback(this);
}


2011年9月29日14:15 Keiji Ariyama <ml_an...@c-lis.co.jp>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
mokkouyou
mokk...@gmail.com

yoshiyuki kanno

unread,
Sep 29, 2011, 2:46:05 AM9/29/11
to android-...@googlegroups.com
菅野です。

スレッドセーフなメソッドであれば、処理Bのタイミングで直接
GameActivity.thisのメソッドを呼び出しても問題ないと思います。

ただActivity既定クラスのメソッドに関しては、スレッドセーフかどうかを見極めるのは
フレームワークのソースを追わないと難しいので、スレッドセーフではない前提で、
実装するのが無難かと思います。

具体的には、GameActivityにHandlerクラスのメンバを用意して、
処理BはHandlerに対して、sendMessage系または、postMessage系のメソッドを呼び出し、
メインスレッド上でGameActivityのメソッド呼び出す事で実現できると思います。

2011年9月29日8:37 DDNOVEL <ddn...@gmail.com>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
Stoic Corp.
CEO Yoshiyuki Kanno
web: http://www.stoic.co.jp/
mailto:yoshiyu...@stoic.co.jp

DDNOVEL

unread,
Sep 29, 2011, 11:21:38 AM9/29/11
to Android-SDK-Japan
みなさんありがとうございます。
いろいろ方法がありそうですね。

試してみます。


On 9月29日, 午後3:46, yoshiyuki kanno <nekota...@gmail.com> wrote:
> 菅野です。
>
> スレッドセーフなメソッドであれば、処理Bのタイミングで直接
> GameActivity.thisのメソッドを呼び出しても問題ないと思います。
>
> ただActivity既定クラスのメソッドに関しては、スレッドセーフかどうかを見極めるのは
> フレームワークのソースを追わないと難しいので、スレッドセーフではない前提で、
> 実装するのが無難かと思います。
>
> 具体的には、GameActivityにHandlerクラスのメンバを用意して、
> 処理BはHandlerに対して、sendMessage系または、postMessage系のメソッドを呼び出し、
> メインスレッド上でGameActivityのメソッド呼び出す事で実現できると思います。
>
> 2011年9月29日8:37 DDNOVEL <ddno...@gmail.com>:
> mailto:yoshiyuki.ka...@stoic.co.jp
Reply all
Reply to author
Forward
0 new messages