本文讲解android中的传感器,这是智能手机中的一个重要组成方面。
我们首先来讲解一下android手机中对坐标的定义:
X轴的方向是沿着屏幕水平方向从左向右,较短的边需要水平放置,较长的变需要垂直放置
Y轴的方向是从屏幕的左下角开始沿着屏幕的垂直方向指向屏幕的顶端
Z轴是将手机平放在桌子上,从手机里指向天空
传感器使用到一个values数组,他一般具有三个参数,参数的意义和传感器类型有关。
一、方向传感器
values[0]:表示方位,即手机围绕Z轴旋转的角度,0表示北,90表示东,180表示南,270表示西,常用于电子罗盘
values[1]:表示手机倾斜角度,0是完全水平(一般为-5到5),完全倾斜是+-180,常用于测量物体倾斜度
values[2]:表示手机沿Y轴的滚动角度,为+-90
二、加速度传感器
values分别表示三个方向上的加速度值
传感器实例:
一、电子罗盘
通过手机上的二维磁阻传感器,我们可以方便的实现电子罗盘(使用时需要将手机平放)
public class Main extends Activity implements SensorEventListener { private ImageView imageView; private float currentDegree = 0f; public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { float degree = event.values[0]; RotateAnimation ra = new RotateAnimation(currentDegree, -degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); ra.setDuration(200); imageView.startAnimation(ra); currentDegree = -degree; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView = (ImageView) findViewById(R.id.imageview); SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); } }
二、计步器
通过检测人走路时的上下震动来计数
<?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"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/btnReset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重置" /> <Button android:id="@+id/btnStop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> </LinearLayout> <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="#FF0" android:background="#00F" android:textSize="150sp" android:gravity="center" /> </LinearLayout>
public class Main extends Activity implements SensorEventListener, OnClickListener { private TextView textView; private float lastPoint; private int count = 0; private boolean flag = true; private SensorManager sm; public void onClick(View view) { String msg = ""; switch (view.getId()) { case R.id.btnStart: sm = (SensorManager) getSystemService(SENSOR_SERVICE); sm.registerListener(this, sm .getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST); msg = "已经开始计步器."; break; case R.id.btnReset: count = 0; msg = "已经重置计步器."; break; case R.id.btnStop: sm.unregisterListener(this); count = 0; msg = "已经停止计步器."; break; } textView.setText(String.valueOf(count)); Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnStart = (Button) findViewById(R.id.btnStart); Button btnReset = (Button) findViewById(R.id.btnReset); Button btnStop = (Button) findViewById(R.id.btnStop); btnStart.setOnClickListener(this); btnReset.setOnClickListener(this); btnStop.setOnClickListener(this); textView = (TextView) findViewById(R.id.textview); textView.setText(String.valueOf(count)); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent event) { if (flag) { lastPoint = event.values[1]; flag = false; } if (Math.abs(event.values[1] - lastPoint) > 8) { lastPoint = event.values[1]; textView.setText(String.valueOf(++count)); } } }
在本实例中,我设置两次values[1]的差大于8即走了一步,大家按需求设置
需求:
每隔一分钟运行一次指定的ruby脚本
实现:
这里我们提供一份儿实验用代码 如果能调通 则我们就可以运行任何脚本了
实验代码如下:
为iOS应用程序开发等待控件
UIActivityIndicatorView
在iOS中开发一个等待控件其实也跟对话框一样特别简单
第一步:把所需要的控件拖入到屏幕当中,如下图
第二步:在ViewController.h文件中加入如下内容,在ViewController.m文件中加入实现方法
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController{ //定义一个等待控件 IBOutlet UIActivityIndicatorView * activityIndicatorView; } //提供GET SET @property(nonatomic,retain)UIActivityIndicatorView * activityIndicatorView; //按钮的点击事件 -(IBAction)prass:(id)sender; @end
ViewController.m
@implementation ViewController //实现GET SET @synthesize activityIndicatorView; -(IBAction)prass:(id)sender{ if ([activityIndicatorView isAnimating]) { [activityIndicatorView stopAnimating]; }else{ [activityIndicatorView startAnimating]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //消除内存 - (void)dealloc { [activityIndicatorView release]; [super dealloc]; } @end
第三步在NIB文件中进行关联 大慨就是按照箭头所指的方向进行关联
就可以实现如下显示的效果
注意:如何让控件在启动的时候不显示,停止的时候消失呢?只有在运行的时候才显示呢?答案很简单只要设置一个属性就行啦
Progress NSTimer
在iOS中开发一个进度条其实也跟等待一样特别简单
第一步:开发界面
第二步编码
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController{ IBOutlet UIProgressView *progressview; NSTimer *timer; } @property(nonatomic,retain) UIProgressView *progressview; @property(nonatomic,assign) NSTimer *timer; -(IBAction)Onclick; @end
ViewController.m
@implementation ViewController @synthesize progressview; @synthesize timer; -(IBAction)Onclick{ progressview.progress = 0.0; timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; } -(void) update{ progressview.progress +=0.1; NSLog(@"%f",progressview.progress); if (progressview.progress == 1.0) { [timer invalidate]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { [progressview release]; [super dealloc]; } @end
第三步同样跟上面的等待控件一样,进行对界面输入输出。运行结果就是,进度条每一秒钟运行一次,10秒后完成