eclipse开发Android小程序:指南针(未实现)
网络111 葛鹏
此程序主要实现指南针功能。
在类AsdActivity里编写代码,主要代码如下:
package asd.c; import android.app.Activity; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.view.WindowManager; public class Compass extends Activity { final static int MENU_QUIT = 1; CompassView view; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = display.getHeight(); view = new CompassView(this,screenWidth,screenHeight); setContentView(view); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_QUIT, 0, "退出"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_QUIT: finish(); return true; } return false; } @Override protected void onDestroy() { super.onDestroy(); view.removeSensorListener(); } @Override protected void onPause() { super.onPause(); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); } }
新建一个类CompassView.java,在类里编写如下代码:
package asd.c; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceView; @SuppressWarnings("unused") public class CompassView extends SurfaceView implements SurfaceHolder.Callback, SensorEventListener { SurfaceHolder mholder; Bitmap background1; SensorManager sensorManager; Sensor orieSensor; int screenWidth =0; int screenHeight =0; float degree = 0; private static final Object LOCK = new Object(); public CompassView(Context context, int screenWidth, int screenHeight) { super(context); background1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher); getHolder().addCallback(this); this.screenWidth = screenWidth; // this.getWidth(); this.screenHeight = screenHeight; // this.getHeight(); sensorManager = (SensorManager) context .getSystemService(Context.SENSOR_SERVICE); orieSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); if (orieSensor != null) { sensorManager.registerListener(this, orieSensor, SensorManager.SENSOR_DELAY_NORMAL); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { synchronized (LOCK) { mholder = holder; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { synchronized (LOCK) { mholder = null; } } public void removeSensorListener() { sensorManager.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } @Override public void onSensorChanged(SensorEvent event) { if (Math.abs(event.values[1]) > 32 || // 围绕x轴的偏转(-180 to 180) Math.abs(event.values[2]) > 20) { // 围绕y轴的偏转 (-90 to 90), synchronized (LOCK) { if (mholder != null) { Canvas can = mholder.lockCanvas(); if (can == null) return; can.drawRGB(0, 0, 0); Paint paint = new Paint(); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.GREEN); can.drawText("我的指南针 by widebright", 20, 20, paint); can.drawText("你的屏幕要水平放置!", 20, screenHeight / 2, paint); mholder.unlockCanvasAndPost(can); } } } else { synchronized (LOCK) { if (mholder != null && (Math.abs (event.values[0] - degree) > 0.4)) { //避免屏幕不动时重复绘制 degree = event.values[0]; Canvas can = mholder.lockCanvas(); if (can == null) return; can.drawRGB(0, 0, 0); Paint paint = new Paint(); paint.setFlags(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.GREEN); can.drawText("我的指南针", 20, 20, paint); can.save(); can.rotate(-1 * event.values[0], screenWidth / 2, screenHeight / 2); can.drawBitmap(background1, screenWidth / 2 - background1.getWidth() / 2, screenHeight / 2 - background1.getHeight() / 2, null); can.restore(); mholder.unlockCanvasAndPost(can); } } } } }
总结:
这个程序对我来说是个比较有难度的程序,首先自己先在百度上面了解了一下相关程序,然后又试着摘抄几段百度搜到的代码,研究了好久都没有搞的完全明白,控件的摆放可能也不对,运行出来的程序不是想象当中的样子,所以我总结出自己底子还不够扎实,需要再从最基本的慢慢学起,一步一个脚印的把基础打扎实,后面编写的程序或者在理解上面肯定会轻松一点,再者还可以写的更详细一点,注释更明确,代码更简洁明了一些,所以从下篇日志开始,我将找出我在这方面空缺知识的总结和注意的地方,争取让自己能够彻底理解每一个程序,对我而言,程序的本身是重在理解,举一反多,所以还需要我不断的学习。