|
Android example source code file (Demo_Multiscreen.java)
The Demo_Multiscreen.java Android example source code/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.clc.bt; import net.clc.bt.Connection.OnConnectionLostListener; import net.clc.bt.Connection.OnConnectionServiceReadyListener; import net.clc.bt.Connection.OnIncomingConnectionListener; import net.clc.bt.Connection.OnMaxConnectionsReachedListener; import net.clc.bt.Connection.OnMessageReceivedListener; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; import android.widget.Toast; /** * Demo application that allows multiple Androids to be linked together as if * they were one large screen. The center screen is the server, and it can link * to 4 other devices: right, left, up, and down. */ public class Demo_Multiscreen extends Activity implements Callback { public static final String TAG = "Demo_Multiscreen"; public static final int CENTER = 0; public static final int RIGHT = 1; public static final int LEFT = 2; public static final int UP = 3; public static final int DOWN = 4; private static final int SERVER_LIST_RESULT_CODE = 42; private Demo_Multiscreen self; private long lastTouchedTime = 0; private int mType; // 0 = server, 1 = client private int mPosition; // The device that has the ball private SurfaceView mSurface; private SurfaceHolder mHolder; private Demo_Ball mBall; private Paint bgPaint; private Paint ballPaint; private Connection mConnection; private String rightDevice = ""; private String leftDevice = ""; private String upDevice = ""; private String downDevice = ""; private OnMessageReceivedListener dataReceivedListener = new OnMessageReceivedListener() { public void OnMessageReceived(String device, String message) { if (message.startsWith("ASSIGNMENT:")) { if (message.equals("ASSIGNMENT:RIGHT")) { leftDevice = device; } else if (message.equals("ASSIGNMENT:LEFT")) { rightDevice = device; } else if (message.equals("ASSIGNMENT:UP")) { downDevice = device; } else if (message.equals("ASSIGNMENT:DOWN")) { upDevice = device; } } else { mPosition = CENTER; mBall.restoreState(message); } } }; private OnMaxConnectionsReachedListener maxConnectionsListener = new OnMaxConnectionsReachedListener() { public void OnMaxConnectionsReached() { Log.e(TAG, "Max connections reached!"); } }; private OnIncomingConnectionListener connectedListener = new OnIncomingConnectionListener() { public void OnIncomingConnection(String device) { if (rightDevice.length() < 1) { mConnection.sendMessage(device, "ASSIGNMENT:RIGHT"); rightDevice = device; } else if (leftDevice.length() < 1) { mConnection.sendMessage(device, "ASSIGNMENT:LEFT"); leftDevice = device; } else if (upDevice.length() < 1) { mConnection.sendMessage(device, "ASSIGNMENT:UP"); upDevice = device; } else if (downDevice.length() < 1) { mConnection.sendMessage(device, "ASSIGNMENT:DOWN"); downDevice = device; } } }; private OnConnectionLostListener disconnectedListener = new OnConnectionLostListener() { public void OnConnectionLost(String device) { if (rightDevice.equals(device)) { rightDevice = ""; if (mPosition == RIGHT) { mBall = new Demo_Ball(true); } } else if (leftDevice.equals(device)) { leftDevice = ""; if (mPosition == LEFT) { mBall = new Demo_Ball(true); } } else if (upDevice.equals(device)) { upDevice = ""; if (mPosition == UP) { mBall = new Demo_Ball(true); } } else if (downDevice.equals(device)) { downDevice = ""; if (mPosition == DOWN) { mBall = new Demo_Ball(true); } } } }; private OnConnectionServiceReadyListener serviceReadyListener = new OnConnectionServiceReadyListener() { public void OnConnectionServiceReady() { if (mType == 0) { mBall = new Demo_Ball(true); mConnection.startServer(4, connectedListener, maxConnectionsListener, dataReceivedListener, disconnectedListener); self.setTitle("MultiScreen: " + mConnection.getName() + "-" + mConnection.getAddress()); } else { mBall = new Demo_Ball(false); Intent serverListIntent = new Intent(self, ServerListActivity.class); startActivityForResult(serverListIntent, SERVER_LIST_RESULT_CODE); } } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); self = this; Intent startingIntent = getIntent(); mType = startingIntent.getIntExtra("TYPE", 0); setContentView(R.layout.main); mSurface = (SurfaceView) findViewById(R.id.surface); mHolder = mSurface.getHolder(); bgPaint = new Paint(); bgPaint.setColor(Color.BLACK); ballPaint = new Paint(); ballPaint.setColor(Color.GREEN); ballPaint.setAntiAlias(true); mConnection = new Connection(this, serviceReadyListener); mHolder.addCallback(self); } private PhysicsLoop pLoop; @Override protected void onDestroy() { if (mConnection != null) { mConnection.shutdown(); } super.onDestroy(); } public void surfaceCreated(SurfaceHolder holder) { pLoop = new PhysicsLoop(); pLoop.start(); } private void draw() { Canvas canvas = null; try { canvas = mHolder.lockCanvas(); if (canvas != null) { doDraw(canvas); } } finally { if (canvas != null) { mHolder.unlockCanvasAndPost(canvas); } } } private void doDraw(Canvas c) { c.drawRect(0, 0, c.getWidth(), c.getHeight(), bgPaint); if (mBall == null) { return; } float x = mBall.getX(); float y = mBall.getY(); if ((x != -1) && (y != -1)) { float xv = mBall.getXVelocity(); Bitmap bmp = BitmapFactory .decodeResource(this.getResources(), R.drawable.android_right); if (xv < 0) { bmp = BitmapFactory.decodeResource(this.getResources(), R.drawable.android_left); } c.drawBitmap(bmp, x - 17, y - 23, new Paint()); } } public void surfaceDestroyed(SurfaceHolder holder) { try { pLoop.safeStop(); } finally { pLoop = null; } } private class PhysicsLoop extends Thread { private volatile boolean running = true; @Override public void run() { while (running) { try { Thread.sleep(5); draw(); if (mBall != null) { int position = mBall.update(); mBall.setAcceleration(0, 0); if (position == RIGHT) { if ((rightDevice.length() > 1) && (mConnection.sendMessage(rightDevice, mBall.getState() + "|" + LEFT) == Connection.SUCCESS)) { mPosition = RIGHT; } else { mBall.doRebound(); } } else if (position == LEFT) { if ((leftDevice.length() > 1) && (mConnection.sendMessage(leftDevice, mBall.getState() + "|" + RIGHT) == Connection.SUCCESS)) { mPosition = LEFT; } else { mBall.doRebound(); } } else if (position == UP) { if ((upDevice.length() > 1) && (mConnection.sendMessage(upDevice, mBall.getState() + "|" + DOWN) == Connection.SUCCESS)) { mPosition = UP; } else { mBall.doRebound(); } } else if (position == DOWN) { if ((downDevice.length() > 1) && (mConnection.sendMessage(downDevice, mBall.getState() + "|" + UP) == Connection.SUCCESS)) { mPosition = DOWN; } else { mBall.doRebound(); } } } } catch (InterruptedException ie) { running = false; } } } public void safeStop() { running = false; interrupt(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if ((resultCode == Activity.RESULT_OK) && (requestCode == SERVER_LIST_RESULT_CODE)) { String device = data.getStringExtra(ServerListActivity.EXTRA_SELECTED_ADDRESS); int connectionStatus = mConnection.connect(device, dataReceivedListener, disconnectedListener); if (connectionStatus != Connection.SUCCESS) { Toast.makeText(self, "Unable to connect; please try again.", 1).show(); } return; } } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { lastTouchedTime = System.currentTimeMillis(); } else if (event.getAction() == MotionEvent.ACTION_UP) { float startX = event.getHistoricalX(0); float startY = event.getHistoricalY(0); float endX = event.getX(); float endY = event.getY(); long timeMs = (System.currentTimeMillis() - lastTouchedTime); float time = timeMs / 1000.0f; float aX = 2 * (endX - startX) / (time * time * 5); float aY = 2 * (endY - startY) / (time * time * 5); // Log.e("Physics debug", startX + " : " + startY + " : " + endX + // " : " + endY + " : " + time + " : " + aX + " : " + aY); float dampeningFudgeFactor = (float) 0.3; if (mBall != null) { mBall.setAcceleration(aX * dampeningFudgeFactor, aY * dampeningFudgeFactor); } return true; } return false; } } Other Android examples (source code examples)Here is a short list of links related to this Android Demo_Multiscreen.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.