1. public static final int CWJ_UP = 0;
2. public static final int CWJ_DOWN = 1;
3. public static final int CWJ_LEFT = 2;
4. public static final int CWJ_RIGHT = 4;
5. public static final int CWJ_FORWARD = 8; //向前
6. public static final int CWJ_BACKWARD = 16; //向后
下面我们做精确的角度旋转修正值定义,我们用到yaw、pitch和roll,相信学过3D开发的网友不会对这些陌生的,我们就把他们对应为绕y、x、z 轴的角度好了,如果你们没有学过3D相关的知识这里Android开发网推荐大家可以通过Cube例子自定义Render来观察这三个值对应立方体的旋转角度。
Yaw在(0,0,0)中, 以xOz的坐标平面中围绕y轴旋转,如果是负角则我们定义为CWJ_YAW_LEFT 即往左边倾斜,同理我们定义如下:
1. public static final int CWJ_YAW_LEFT = 0;
2. public static final int CWJ_YAW_RIGHT = 1;
3. public static final int CWJ_PITCH_UP = 2;
4. public static final int CWJ_PITCH_DOWN = 4;
5. public static final int CWJ_ROLL_LEFT = 8;
6. public static final int CWJ_ROLL_RIGHT = 16;
我们通过加速感应器可以获得 SensorEvent的四个值,今天Android123给大家一个简单示例,不考虑其他因素,在public int accuracy 、public Sensor sensor 、public long timestamp 和 public final float[] values 中,我们获取values的浮点数组来判断方向。
int nAndroid123=CWJ_UP //向上
float ax = values[0];
float ay = values[1];
float az = values[2];
float absx = Math.abs(ax);
float absy = Math.abs(ay);
float absz = Math.abs(az);
if (absx > absy && absx > absz) {
if (ax > 0) {
nAndroid123 = CWJ_RIGHT;
} else {
nAndroid123 = CWJ_LEFT;
}
} else if (absy > absx && absy > absz) {
if (ay > 0) {
nAndroid123= CWJ_FORWARD;
} else {
nAndroid123= CWJ_BACKWARD;
}
} else if (absz > absx && absz > absy) {
if (az > 0) {
nAndroid123 = CWJ_UP;
} else {
nAndroid123 = CWJ_DOWN;
}
} else {
nAndroid123 = CWJ_UNKNOWN;
}
学习内容:1.GridView的使用
2.AlertDialog显示框的使用
1.先在res文件夹的drawable三个文件夹下放入图片
2.写布局main.xml
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/widget0"
>
<GridView
android:id="@+id/grid"
android:layout_width="fill_parent"
android:padding="30dip"
android:columnWidth="52px"
android:layout_height="210px"
android:numColumns="5"
/>
<ImageView
android:id="@+id/ImageView_Big"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="95px"
android:layout_y="250px"
/>
</AbsoluteLayout>
3.工程的Activity内容
package com.chaowen;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;
public class gridViewDemo extends Activity implements GridView.OnItemClickListener,GridView.OnItemSelectedListener{
/** Called when the activity is first created. */
private GridView my_GridView;
private ImageAdapter myImageAdapter;
private ImageView big_ImageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
my_GridView = (GridView)findViewById(R.id.grid);
big_ImageView = (ImageView)findViewById(R.id.ImageView_Big);
myImageAdapter = new ImageAdapter(this);
//为my_GridView设置一个ImageAdapter
my_GridView.setAdapter(myImageAdapter);
/**
* GridView的图片Items点击事件处理
*/
my_GridView.setOnItemClickListener(this);
}
private class ImageAdapter extends BaseAdapter{
//myContext为上下文
private Context myContext;
//GridView用来加载图片的ImageView
private ImageView the_imageView;
//这是图片资源ID的数组
private Integer[] mImageIds = {R.drawable.a,R.drawable.b,R.drawable.c,
R.drawable.d,R.drawable.e,R.drawable.f,R.drawable.g};
//构造方法
public ImageAdapter(Context myContext){
this.myContext = myContext;
}
//返回资源ID数组的长度
@Override
public int getCount() {
return mImageIds.length;
}
//得到Items
@Override
public Object getItem(int position) {
return position;
}
//得到Items的ID
@Override
public long getItemId(int position) {
return position;
}
//处理gridview的每个Item
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建一个ImageView
the_imageView = new ImageView(myContext);
//设置图像源于资源ID
the_imageView.setImageResource(mImageIds[position]);
//使Imageview与边界适应
the_imageView.setAdjustViewBounds(true);
//设置背景图片的风格
the_imageView.setBackgroundResource(android.R.drawable.picture_frame);
//返回带有多个图片Id的Imageview
return the_imageView;
}
//自定义获取对应位置的图片ID
public Integer getCheckedImageIDPosition(int index){
return mImageIds[index];
}
}
//点击GridView中图片Items后显示一个AlterDialog提示框
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
new AlertDialog.Builder(this)
.setTitle("图片浏览")
//获得对应的图片并显示
.setIcon(myImageAdapter.getCheckedImageIDPosition(arg2))
//添加一个按钮
.setPositiveButton("返回", new OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}).show();
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//GridView中的图片移动焦点选中时,下面的大图ImageView显示相应的大图片
big_ImageView.setImageResource(myImageAdapter.getCheckedImageIDPosition(arg2));
}
//未选中GridView中的图片Items事件处理
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
7.6 使用Geocoder
地理编码可以在街道地址和经纬度地图坐标之间进行转换。这样,就可以为基于位置的服务,或者基于地图的活动中所使用的位置或者坐标,提供一个可识别的上下文。
Geocoder类提供了对两种地理编码功能的访问:
Forward Geocoding(前向地理编码) 查找某个地址的经纬度
Reverse Geocoding(反向地理编码) 查找一个给定的经纬度所对应的街道地址。
这些调用返回的结果将会通过使用一个局域设置来进行情境化(contextualized),其中区域设置用来定义通常的位置和语言。下面的代码段展示了如何在创建Geocoder的时候设定区域设置。如果没有指定区域设置,那么它将会被假定为你的设备默认的区域设置。
这两种地理编码函数返回的都是Address对象列表。每一个列表都可以包含多个可能的结果,它的上限是在调用函数时指定的。
每一个Address对象都是使用Geocoder所能够解析的尽可能多的细节来填充的。它可以包含经度、纬度、电话号码以及其他一些地址细节,从国家到街道和门牌号。
提示:
Geocoder查找是同步地进行的,因此,它们将会阻塞调用它们的线程。对于低速的数据连接来说,这可能会导致出现一个应用程序不响应的对话框。在大部分情况下,更好的做法是把这些查找移动到服务或者后台线程中,如第8章所示。
为了清晰和简洁起见,本章的代码中出现的对这些函数的调用都放在了主应用程序线程中。
http://book.51cto.com/art/201007/213744.htm
7.6.1 反向地理编码
反向地理编码可以返回物理位置的街道地址,其中物理位置由经纬度值对指定。它为由基于位置的服务所返回的位置提供了一个可识别的上下文。
要执行反向查找,需要向Geocoder的getFromLocation方法传入目标经度和纬度。它会返回一个可能匹配的地址的列表。如果对于指定的坐标,Geocoder不能解析出任何地址,那么它将会返回null。
下面的例子展示了如何对最后知道的位置进行反向地理编码:
反向查找的精度和粒度完全是由地理编码数据库中的数据质量决定的,因此,结果的质量在不同的国家和地区之间差别可能会很大。
http://book.51cto.com/art/201007/213746.htm
7.6.2 前向地理编码
前向地理编码(或者可以简单地称它为地理编码)可以确定一个给定位置的地图坐标。
提示:
一个有效的位置的组成,会根据搜索的区域(地理区域)的不同而不同。一般来说,它将包括各种正规的、不同粒度的街道地址(从国家到街道名和号码)、邮编、火车站、界标和医院。通常的习惯是,有效的搜索对象与可以输入到Google地图搜索栏中的地址和位置是很相似的。
通过在一个Geocoder实例上调用getFromLocationName,就可以执行前向地理编码查找。在这个过程中需要传递给它想要的坐标的位置以及要返回的结果数量的最大值,如下面的代码所示:
返回的地址列表中可能包含多个可能的匹配。其中每一个地址结果都将包含经度和纬度以及对那些坐标有用的所有额外的信息。这对于保证所解析的地址的正确性是很有用的,而且还能够在查找界标的时候提供地址的细节。
提示:
和反向编码一样,如果没有找到任何匹配的内容,那么它将会返回null。编码结果的可用性、精度和粒度都完全依赖于你正在查找的区域中可用的数据库。
在进行前向查找的过程中,创建Geocoder对象时所指定的区域设置尤其重要。区域设置提供了解释搜索请求的地理上下文,因为多个区域可能会存在相同的位置名称。在可能的地方,应该考虑选择一个地区的区域设置以避免地址名称歧义。
同时,应该使用尽可能多的地址细节。例如,下面的代码段说明了一个对New York街道地址所进行的前向地理编码:
为了得到更加详尽的结果,可以使用getFromLocationName方法的重载,它会把搜索限制在一个地理边界范围内,如下面的代码所示:
在与MapView一起使用的时候,这种重载就特别有用,因为它可以把搜索限制在可视的地图范围内。