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);

}
}

}
}

} 

总结:

这个程序对我来说是个比较有难度的程序,首先自己先在百度上面了解了一下相关程序,然后又试着摘抄几段百度搜到的代码,研究了好久都没有搞的完全明白,控件的摆放可能也不对,运行出来的程序不是想象当中的样子,所以我总结出自己底子还不够扎实,需要再从最基本的慢慢学起,一步一个脚印的把基础打扎实,后面编写的程序或者在理解上面肯定会轻松一点,再者还可以写的更详细一点,注释更明确,代码更简洁明了一些,所以从下篇日志开始,我将找出我在这方面空缺知识的总结和注意的地方,争取让自己能够彻底理解每一个程序,对我而言,程序的本身是重在理解,举一反多,所以还需要我不断的学习。

posted @ 2013-06-22 22:10  mymo  阅读(1014)  评论(0编辑  收藏  举报