·
· 在Eclipse中開發android應用必備工具。
在Eclipse編譯IDE環境中,需安裝ADT(Android Development Tools)Plug-in,這是Android在Eclipse上的開發工具。
目前這個是最新版。
在Eclipse編譯IDE環境中,需安裝ADT(Android Development Tools)Plug-in,這是Android在Eclipse上的開發工具。
目前這個是最新版。
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.himi"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
- <uses-sdk android:minSdkVersion="4" />
- </manifest>
很明顯我在故意消耗記憶體和時間。
- /**
- * @author Himi
- * @param canvas
- */
- public void hot(Canvas canvas) {
- for (int i = 1; i < 100; i++) {
- Bitmap bmp = BitmapFactory.decodeResource(getResources(),
- R.drawable.icon);
- canvas.drawBitmap(bmp, i += 2, i += 2, paint);
- }
- }
代碼很簡單,一個是處理實體按鍵的回應時間,另一個是觸屏的回應事件、那麼這裡要說的有兩點:
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- Log.v("test", "onTouchEvent");
- bmp_y++;
- if (event.getAction() == MotionEvent.ACTION_MOVE) {
- Log.v("Himi", "ACTION_MOVE");
- } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
- Log.v("Himi", "ACTION_DOWN");
- } else if (event.getAction() == MotionEvent.ACTION_UP) {
- Log.v("Himi", "ACTION_UP");
- }
- return true;
- //return super.onTouchEvent(event);//备注1
- }
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- Log.v("test", "onKeyDown");
- bmp_x++;
- return super.onKeyDown(keyCode, event);
- }
這個例子是當你Touch Down的時候會送event進來,接著印出Log,然後呼叫super的onTouchEvent()並回傳佈林值。此時會回傳false,並且之後再也收不到Touch Move或Touch Up的event,為了要確保能收到event,必須要回傳true,所以在這裡要注意一下。
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- Log.i("ConanLog", "Event"+event.getAction());
- return super.onTouchEvent(event);
- }
AndroidManifest.xml中:
- public void onConfigurationChanged(Configuration newConfig) {
- try {
- super.onConfigurationChanged(newConfig);
- if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
- Log.v("Himi", "onConfigurationChanged_ORIENTATION_LANDSCAPE");
- } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
- Log.v("Himi", "onConfigurationChanged_ORIENTATION_PORTRAIT");
- }
- } catch (Exception ex) {
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.himi" android:versionCode="1" android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MainActivity" android:label="@string/app_name"
- android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="4" />
- </manifest>
一、 MediaPlayer 播放音訊的實現步驟:
- package com.himi;
- import java.util.HashMap;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.media.SoundPool;
- import android.view.KeyEvent;
- import android.view.MotionEvent;
- import android.view.SurfaceHolder;
- import android.view.SurfaceView;
- import android.view.SurfaceHolder.Callback;
- public class MySurfaceView extends SurfaceView implements Callback, Runnable {
- private Thread th;
- private SurfaceHolder sfh;
- private Canvas canvas;
- private MediaPlayer player;
- private Paint paint;
- private boolean ON = true;
- private int currentVol, maxVol;
- private AudioManager am;
- private HashMap<Integer, Integer> soundPoolMap;//备注1
- private int loadId;
- private SoundPool soundPool;
- public MySurfaceView(Context context) {
- super(context);
- // 获取音频服务然后强转成一个音频管理器,后面方便用来控制音量大小用
- am = (AudioManager) MainActivity.instance
- .getSystemService(Context.AUDIO_SERVICE);
- maxVol = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
- // 获取最大音量值(15最大! .不是100!)
- sfh = this.getHolder();
- sfh.addCallback(this);
- th = new Thread(this);
- this.setKeepScreenOn(true);
- setFocusable(true);
- paint = new Paint();
- paint.setAntiAlias(true);
- //MediaPlayer的初始化
- player = MediaPlayer.create(context, R.raw.himi);
- player.setLooping(true);//设置循环播放
- //SoundPool的初始化
- soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
- soundPoolMap = new HashMap<Integer, Integer>();
- soundPoolMap.put(1, soundPool.load(MainActivity.content,
- R.raw.himi_ogg, 1));
- loadId = soundPool.load(context, R.raw.himi_ogg, 1);
- //load()方法的最后一个参数他标识优先考虑的声音。目前没有任何效果。使用了也只是对未来的兼容性价值。
- }
- public void surfaceCreated(SurfaceHolder holder) {
- /*
- * Android OS中,如果你去按手机上的调节音量的按钮,会分两种情况,
- * 一种是调整手机本身的铃声音量,一种是调整游戏,软件,音乐播放的音量
- * 当我们在游戏中的时候 ,总是想调整游戏的音量而不是手机的铃声音量,
- * 可是烦人的问题又来了,我在开发中发现,只有游戏中有声音在播放的时候
- * ,你才能去调整游戏的音量,否则就是手机的音量,有没有办法让手机只要是
- * 在运行游戏的状态就只调整游戏的音量呢?试试下面这段代码吧!
- */
- MainActivity.instance.setVolumeControlStream(AudioManager.STREAM_MUSIC);
- // 设定调整音量为媒体音量,当暂停播放的时候调整音量就不会再默认调整铃声音量了,娃哈哈
- player.start();
- th.start();
- }
- public void draw() {
- canvas = sfh.lockCanvas();
- canvas.drawColor(Color.WHITE);
- paint.setColor(Color.RED);
- canvas.drawText("当前音量: " + currentVol, 100, 40, paint);
- canvas.drawText("当前播放的时间" + player.getCurrentPosition() + "毫秒", 100,
- 70, paint);
- canvas.drawText("方向键中间按钮切换 暂停/开始", 100, 100, paint);
- canvas.drawText("方向键←键快退5秒 ", 100, 130, paint);
- canvas.drawText("方向键→键快进5秒 ", 100, 160, paint);
- canvas.drawText("方向键↑键增加音量 ", 100, 190, paint);
- canvas.drawText("方向键↓键减小音量", 100, 220, paint);
- sfh.unlockCanvasAndPost(canvas);
- }
- private void logic() {
- currentVol = am.getStreamVolume(AudioManager.STREAM_MUSIC);// 不断获取当前的音量值
- }
- @Override
- public boolean onKeyDown(int key, KeyEvent event) {
- if (key == KeyEvent.KEYCODE_DPAD_CENTER) {
- ON = !ON;
- if (ON == false)
- player.pause();
- else
- player.start();
- } else if (key == KeyEvent.KEYCODE_DPAD_UP) {// 按键这里本应该是RIGHT,但是因为当前是横屏模式,以下雷同
- player.seekTo(player.getCurrentPosition() + 5000);
- } else if (key == KeyEvent.KEYCODE_DPAD_DOWN) {
- if (player.getCurrentPosition() < 5000) {
- player.seekTo(0);
- } else {
- player.seekTo(player.getCurrentPosition() - 5000);
- }
- } else if (key == KeyEvent.KEYCODE_DPAD_LEFT) {
- currentVol += 1;
- if (currentVol > maxVol) {
- currentVol = 100;
- }
- am.setStreamVolume(AudioManager.STREAM_MUSIC, currentVol,// 备注2
- AudioManager.FLAG_PLAY_SOUND);
- } else if (key == KeyEvent.KEYCODE_DPAD_RIGHT) {
- currentVol -= 1;
- if (currentVol <= 0) {
- currentVol = 0;
- }
- am.setStreamVolume(AudioManager.STREAM_MUSIC, currentVol,
- AudioManager.FLAG_PLAY_SOUND);
- }
- soundPool.play(loadId, currentVol, currentVol, 1, 0, 1f);// 备注3
- // soundPool.play(soundPoolMap.get(1), currentVol, currentVol, 1, 0, 1f);//备注4
- // soundPool.pause(1);//暂停SoundPool的声音
- return super.onKeyDown(key, event);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return true;
- }
- public void run() {
- // TODO Auto-generated method stub
- while (true) {
- draw();
- logic();
- try {
- Thread.sleep(100);
- } catch (Exception ex) {
- }
- }
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- }
- }
xml 修改的不大,主要將之前的線性佈局改成了相對佈局。雖然改動不大,但是也真的費了不少時間去調整、這樣一來大家就可以在自己的遊戲Surfaceview中隨意添加元件啦,娃哈哈~~~
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1" >
- <com.himi.MySurfaceView android:id="@+id/view3d"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:text="Himi Button_1"
- android:id="@+id/button1"/>
- <Button android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_toRightOf="@id/button1"
- android:text="Himi Button_2"
- android:id="@+id/button2"/>
- <TextView
- android:id="@+id/textview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="This is Himi"
- android:textSize="32sp"
- android:textColor="#00FF00"
- android:gravity="center_horizontal"/>
- </RelativeLayout>
- </LinearLayout>
注意: 隱去標題(應用的名字) 此設定必須要寫在setContentView之前,否則會有異常!
- package com.himi;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Window;
- import android.view.WindowManager;
- public class MainActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- //隱去電池等圖示和一切修飾部分(狀態列部分)
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- // 隱去標題列(程式的名字)
- setContentView(new MyView(this));
- }
- }
設置橫豎屏也可以在AndroidManifest.xml中定義:
- package com.himi;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.Paint;
- import android.graphics.Rect;
- import android.graphics.RectF;
- import android.view.View;
- public class MyView extends View {
- private Paint paint ;
- public MyView(Context context) {
- super(context);
- paint = new Paint();
- paint.setAntiAlias(true);//設置畫筆無鋸齒(如果不設置可以看到效果很差)
- this.setKeepScreenOn(true);//設置背景常亮
- paint.setColor(Color.RED);
- }
- @Override
- public void onDraw(Canvas canvas) {
- canvas.drawColor(Color.WHITE);//設置刷屏顏色
- Rect rect = new Rect(30,30,50,50); //這裡最後兩個參數不是寬高、而是矩形右下角的座標
- canvas.drawRect(rect, paint);
- RectF rectF = new RectF(70f,30f,90f,90f);//RectF 只是矩形 float形式 只是跟Rect精確度不一樣
- canvas.drawArc(rectF, 0, 360, true, paint);
- canvas.drawCircle(150, 30, 20, paint);//這也是畫圓 第三個參數為半徑
- float[] points =new float[]{200f,10f,200f,40f,300f,30f,400f,70f};
- canvas.drawLines(points, paint);
- // canvas.drawLines(points, 1, 4, paint);//選取特定點陣列中兩點來畫出一條直線
- canvas.drawText("Himi", 230, 30, paint);
- }
- }