㈠ android中如何让图标绕一个中心点旋转
1、定义一个ImageView
定义一个ImageView是为了装载图片,其中的图片将被rotate用来进行旋转,其他View亦可。
资源文件为
java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/infoOperating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/operating"
android:scaleType="center">
</ImageView>
</LinearLayout>
其中的android:src为图片内容,可使用附件中的图片。
java代码为
Java代码
ImageView infoOperatingIV = (ImageView)findViewById(R.id.infoOperating);
2、定义rotate旋转效果
在res/anim文件夹下新建tip.xml文件,内容如下
Java代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="359"
android:ration="500"
android:repeatCount="-1"
android:pivotX="50%"
android:pivotY="50%" />
</set>
含义表示从0到359度开始循环旋转,0-359(若设置成360在停止时会出现停顿现象)度旋转所用时间为500ms,旋转中心距离view的左顶点为50%距离,距离view的上边缘为50%距离,即正中心,具体每个含义见下面的具体属性介绍。
java代码为
Java代码
Animation operatingAnim = AnimationUtils.loadAnimation(this, R.anim.tip);
LinearInterpolator lin = new LinearInterpolator();
operatingAnim.setInterpolator(lin);
setInterpolator表示设置旋转速率。LinearInterpolator为匀速效果,Accelerateinterpolator为加速效果、DecelerateInterpolator为减速效果,具体可见下面android:interpolator的介绍。
a. 关于其中的属性意义如下(红色部分加以注意):
android:fromDegrees 起始的角度度数
android:toDegrees 结束的角度度数,负数表示逆时针,正数表示顺时针。如10圈则比android:fromDegrees大3600即可
android:pivotX 旋转中心的X坐标
浮点数或是百分比。浮点数表示相对于Object的左边缘,如5; 百分比表示相对于Object的左边缘,如5%; 另一种百分比表示相对于父容器的左边缘,如5%p; 一般设置为50%表示在Object中心
android:pivotY 旋转中心的Y坐标
浮点数或是百分比。浮点数表示相对于Object的上边缘,如5; 百分比表示相对于Object的上边缘,如5%; 另一种百分比表示相对于父容器的上边缘,如5%p; 一般设置为50%表示在Object中心
android:ration 表示从android:fromDegrees转动到android:toDegrees所花费的时间,单位为毫秒。可以用来计算速度。
android:interpolator表示变化率,但不是运行速度。一个插补属性,可以将动画效果设置为加速,减速,反复,反弹等。默认为开始和结束慢中间快,
android:startOffset 在调用start函数之后等待开始运行的时间,单位为毫秒,若为10,表示10ms后开始运行
android:repeatCount 重复的次数,默认为0,必须是int,可以为-1表示不停止
android:repeatMode 重复的模式,默认为restart,即重头开始重新运行,可以为reverse即从结束开始向前重新运行。在android:repeatCount大于0或为infinite时生效
android:detachWallpaper 表示是否在壁纸上运行
android:zAdjustment 表示被animated的内容在运行时在z轴上的位置,默认为normal。
normal保持内容当前的z轴顺序
top运行时在最顶层显示
bottom运行时在最底层显示
b. 运行速度
运行速度为运行时间(android:ration)除以运行角度差(android:toDegrees-android:fromDegrees),比如android:ration为1000,android:toDegrees为360,android:fromDegrees为0就表示1秒转1圈。
c. 循环运行
Java代码
android:fromDegrees="0"
android:toDegrees="360"
android:repeatCount="-1"
android:repeatCount="-1"即表示循环运行,配合上android:fromDegrees="0" android:toDegrees="360"表示不间断
3、开始和停止旋转
在操作开始之前调用
Java代码
if (operatingAnim != null) {
infoOperatingIV.startAnimation(operatingAnim);
}
在操作完成时调用
Java代码
infoOperatingIV.clearAnimation();
许多朋友不知道如何停止旋转animation,所以强制设置rotate转动多少圈表示操作,但却无法与操作实际的进度匹配上,实际上只要如上代码所示清除animation即可。
㈡ android怎么实现一张图片旋转几秒后后自动换到另一张图片
图片旋转使用动画,设置动画时间,旋转完成后,设置另一张图片
RotateAnimation 动画,
RotateAnimation (float fromDegrees, float toDegrees, int
pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int
pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float
pivotXValue:X坐标的伸缩值。
int
pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float
pivotYValue:Y坐标的伸缩值。
㈢ Android中怎么使一张图片绕Y轴自动旋转
动画animation能实现围绕自身某个点旋转和围绕外部屏幕上某个点旋转.
㈣ 如何在android的驱动程序中对加速度传感器的数据进行方向和坐标的转
一部智能手机或便携设备应具有Wi-Fi 和互联网功能,能够运行应用软件等诸多特征,而且一定会具有内置传感器。高端智能手机可能集成接近传感器,环境光传感器,3
轴加速度计,以及磁力计等多种传感器。 Android 2.3
添加了一些支持多种新型传感器的API,包括陀螺仪、旋转向量、线性加速度、重力和气压传感器等。应用软件可以使用这些新型传感器,将它们组合起来,就可以实现高精确度的高级运动检测功能。
3 轴加速度计或低g 值传感器是Android API
支持的传感器之一,具有特定的坐标系统,可以给应用程序提供标准的接口数据。坐标空间的定义与手机屏幕的默认方向有关,如图1所示。
图
1. 3 轴加速度计的Android 坐标系统
在Android 坐标系统中,坐标原点位于屏幕的左下角,X 轴水平指向右侧,Y 轴垂直指向顶部,Z
轴指向屏幕前方。在该系统中,屏幕后方的坐标具有负的Z 轴值。Android 加速度计数据定义为:
Sensor.TYPE_ACCELEROMETER
所有数值都采用SI
标准单位(m/s2),测量手机的加速度值,并减去重力加速度分量。
values[0]:x 轴上的加速度值减去Gx
values[1]:y
轴上的加速度值减去Gy
values[2]:z 轴上的加速度值减去Gz
例如,当设备平放在桌上并推着其左侧向右移动时,x
轴加速度值为正。当设备平放在桌上时,加速度值为+9.81,这是用设备的加速度值 (0 m/s2) 减去重力加速度值 (-9.81 m/s2)得到的。
当设备平放在桌上放,并以加速度A m/s2 朝天空的方向推动时,加速度值等于A+9.81,这是用设备加速度值(+A
m/s2)减去重力加速度值(-9.81 m/s2)得到的。
表 1
列出了与设备的各个位置相对应的传感器的加速度值读数。用户可以用下表检查加速度计的方向与系统坐标是否一致。
在 Android HAL 文件中改变 X、Y 和Z 轴的方向
在 HAL
文件中,会有一组宏定义,用于把从传感器中读取的加速度数据转换为标准单位(m/s2)。如以下代码:
// conversion of
acceleration data to SI units (m/s^2)
#define CONVERT_A (GRAVITY_EARTH /
LSG)
#define CONVERT_A_X (-CONVERT_A)
#define CONVERT_A_Y (CONVERT_A)
#define CONVERT_A_Z (CONVERT_A)
在这个宏定义中,常量GRAVITY_EARTH
是一个标准重力加速度值,即9.81m/s2,LSG为一个重力加速度值的最小有效计数值,例如,MMA8452
在正常模式下的读数为1024。因此,CONVERT_A 用于把从加速度传感器中读取的数据,从数字读数转换为标准重力加速度单位。
通过分别修改CONVERT_A_X、CONVERT_A_Y 和CONVERT_A_Z,我们可以轻松地改变X、Y 和Z
轴的方向。如果该轴的方向与系统定义相反,可以使用(-CONVERT_A)来改变其方向。如果方向一致,就使用(CONVERT_A),则保持方向不变。
这个宏定义位于FSL Android 9 (Android 2.2)驱动程序的HAL文件sensor.c 中。对于FSLAndroid 10
(Android 2.3),您可以在’libsensors’文件夹的HAL 文件Sensor.h 中找到它。
在 Android 2.2 HAL
文件中交换X 轴和Y 轴
在某些情况下,X 和Y 轴必须进行交换,以便使传感器数据的坐标与系统坐标保持一致。
对于 FSL
Android 9 (Android 2.2)驱动程序来说,X 轴和Y 轴的交换非常简单。首先,在HAL 文件sensor.c
中,在函数sensor_poll() 中找到以下代码:
switch (event.code) {
case ABS_X:
sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case
ABS_Y:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;
case ABS_Z:
sSensors.acceleration.z = event.value * CONVERT_A_Z;
break;
}
然后,根据如下所示修改代码:
switch (event.code) {
case
ABS_X:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;
case ABS_Y:
sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case ABS_Z:
sSensors.acceleration.z = event.value *
CONVERT_A_Z;
break;
}
在 Android 2.3 的HAL 文件中交换X 轴和Y 轴
在
Android 2.3 的HAL 文件中交换X 轴和Y 轴会更加复杂些,因为它具有更复杂的HAL文件结构。所有HAL
文件都位于文件夹‘libsensors’中。文件AccelSensor.cpp 中的两个函数需要修改。
首先,修改函数AccelSensor()的代码,如下所示:
if
(accel_is_sensor_enabled(SENSOR_TYPE_ACCELEROMETER)) {
mEnabled |=
1<<accelerometer; if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X),
&absinfo)) {
mPendingEvents[Accelerometer].acceleration.y =
absinfo.value * CONVERT_A_Y;
}
if (!ioctl(data_fd,
EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.x = absinfo.value * CONVERT_A_X;
}
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.z = absinfo.value * CONVERT_A_Z;
}
}
然后,修改函数processEvent()的代码,如下所示:
void
AccelSensor::processEvent(int code, int value)
{
switch (code) {
case EVENT_TYPE_ACCEL_X:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.y = value * CONVERT_A_Y;
break;
case EVENT_TYPE_ACCEL_Y:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.x = value * CONVERT_A_X;
break;
case EVENT_TYPE_ACCEL_Z:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.z = value * CONVERT_A_Z;
break;
}
}
完成后,X 轴和Y 轴的数据就互相交换了。
在 Kernel 驱动文件中交换X 轴和Y 轴
X 轴和Y 轴的数据交换可以在底层的Linux 驱动中,在刚开始读取传感器数据时实施。通过这种方法,无论传感器芯片以何种方式安装在PCB
中,或者使用各种不同类型的传感器,HAL 文件都可以保持一致。
对于 Android 2.2 和2.3
来说,执行该操作的最便捷的方式是修改函数report_abs()中的代码。在该函数中,传感器数据通过调用函数mma8452_read_data()读取,如下所示(当使用的传感器为MMA8452Q
时):
if (mma8452_read_data(&x,&y,&z) != 0) {
//DBG("mma8452 data read failed
");
return; }
X 轴和Y
轴可以通过以下方式轻松交换:
if (mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read failed
");
return; }
对于 Android
2.2,MMA8452 的Kernel 驱动文件为mma8452.c;对于Android 2.3,驱动文件是‘hwmon’文件夹中的mxc_mma8452.c。
在 Kernel 驱动文件中改变 X、Y 和Z 轴的方向
传感器数据的方向也可以在Kernel
驱动文件中更改。以下带有注释的语句可以添加到函数report_abs()中,从而改变数据方向:
if
(mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read
failed
");
return;
}
x *= -1; //Reverse X direction
y *= -1;
//Reverse Y direction
z *= -1; //Reverse Z direction
input_report_abs(mma8452_idev->input, ABS_X, x);
input_report_abs(mma8452_idev->input, ABS_Y, y);
input_report_abs(mma8452_idev->input, ABS_Z, z);
input_sync(mma8452_idev->input);
总结
Android
系统已经为加速度计定义了坐标系统,因此用户必须转换从实际传感器中读取的数据,从而与其保持一致。无论是否需要转换,都应检查X、Y 和Z
轴的方向以及X-Y轴坐标。我们可以更改HAL 文件或Kernel 驱动文件来改变轴的方向,或交换X 和Y 轴,但是不要同时修改HAL 文件和Kernel 驱动。
找找
㈤ android 怎么让图片实现朝Z轴的方向旋转RotateAnimation是x y方向的,我想要包含z方向的
RotateAnimation是不可以绕Z轴旋转的,如果LZ想要实现Z轴旋转效果,可以看下matrix这个类(实际还是opengl),可以给LZ例举下:
rotateX(float degree) 绕着x轴旋转degree个度数
rotateY(float degree) 绕着y轴旋转degree个度数
rotateZ(float degree) 绕着z轴旋转degree个度数
㈥ android 中用画布旋转图片的时候怎么让让他 围着一个坐标旋转
方法只有一种。
步骤:
1、画布平移坐标原点
2、旋转画布
示例代码
canvas.save();//保存当前画布状态
canvas.translate(x,y);//将坐标中心平移到要围绕的坐标点x,y
canvas.rotate(90);//旋转角度,这里比如90度
canvas.restore();//恢复画图状态到保存前
㈦ Android 旋转动画
<rotate
android:fromDegrees="45"//起始旋转的角度
android:toDegrees="89"//结束选装后的角度
android:ration="500"//执行时间为500ms
android:pivotX="50%"//距离控件左边缘50%
android:pivotY="50%"//距离控件上边缘50%(与上边结合就是控件中心)
android:fillEnabled="true"
android:fillAfter="true"//动画执行完后停留在执行完的状态
/>
—————————————————————————————————————————
当然也可以通过代码用animation实现
好久没写,应该是
RotateAnimationanimation=newRotateAnimation(0f,45f,Animation.RELATIVE_TO_SELF,
0.5f,Animation.RELATIVE_TO_SELF,0.5f);
animation.setDuration(500);
view.setAnimation(animation);
㈧ 检测android哪些应用持有sensor
感应检测功能:
1、取得SensorManager
使用感应检测Sensor首要先获取感应设备的检测信号,你可以调用Context.getSysteService(SENSER_SERVICE)方法来取得感应检测的服务
2、实现取得感应检测Sensor状态的监听功能
实现以下两个SensorEventListener方法来监听,并取得感应检测Sensor状态:
//在感应检测到Sensor的精密度有变化时被调用到。
public void onAccuracyChanged(Senso sensor,int accuracy);
//在感应检测到Sensor的值有变化时会被调用到。
public void onSensorChanged(SensorEvent event);
3、实现取得感应检测Sensor目标各类的值
实现下列getSensorList()方法来取得感应检测Sensor的值;
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_TEMPERATURE);
4、注册SensorListener
sm.regesterListener(SensorEventListener listener, Sensor sensor, int rate);
第一个参数:监听Sensor事件,第二个参数是Sensor目标种类的值,第三个参数是延迟时间的精度密度。
加速度感应检测——Accelerometer
Accelerometer Sensor测量的是所有施加在设备上的力所产生的加速度的负值(包括重力加速度)。加速度所使用的单位是m/sec^2,数值是加速度的负值。
SensorEvent.values[0]:加速度在X轴的负值
SensorEvent.values[1]:加速度在Y轴的负值
SensorEvent.values[2]:加速度在Z轴的负值
例如:
当手机Z轴朝上平放在桌面上,并且从左到右推动手机,此时X轴上的加速度是正数。
当手机Z轴朝上静止放在桌面上,此时Z轴的加速度是+9.81m/sec^2。
当手机从空中自由落体,此时加速度是0
当手机向上以Am/sec^2的加速度向空中抛出,此时加速度是A+9.81m/sec^2
重力加速度感应检测——Gravity
重力加速度,其单位是m/sec^2,其坐标系与Accelerometer使用的一致。当手机静止时,gravity的值和Accelerometer的值是一致的。
线性加速度感应检测——Linear-Acceleration
Accelerometer、Gravity和Linear-Acceleration三者的关系如下公式:
accelerometer = gravity + linear-acceleration
地磁场感应检测——Magnetic-field
地磁场的单位是micro-Tesla(uT),检测的是X、Y、Z轴上的绝对地磁场。
陀螺仪感应检测——Gyroscope
陀螺仪的单位是弧度/秒,测量的是物体分别围绕X,Y,Z轴旋转的角速度。它的坐标系与加速度传感器的坐标系相同。逆时针方向旋转的角度正的。也就是说,如果设备逆时针旋转,观察者向X,Y,Z轴的正方向看去,就报告设备是正转的。请注意,这是标准的正旋转的数学定义。
光线感应检测——Light
values[0]:表示环境光照的水平,单位是SI lux。
位置逼近感应检测——Proximity
values[0]:逼近的距离,单位是厘米(cm)。有一些传感器只能支持近和远两种状态,这种情况下,传感器必须报告它在远状态下的maximum_range值和在近状态下的小值。
旋转矢量感应检测——Rotation Vector
旋转向量是用来表示设备的方向,它是由角度和轴组成,就是设备围绕x,y,z轴之一旋转θ角度。旋转向量的三个要素是,这样旋转向量的大小等于sin(θ/2),旋转向量的方向等于旋转轴的方向。
values[0]: x*sin(θ/2)
values[1]: y*sin(θ/2)
values[2]: z*sin(θ/2)
values[3]: cos(θ/2) (optional: only if value.length = 4)
方向感应检测——Orientation
其单位是角度
values[0]: Azimuth(方位),地磁北方向与y轴的角度,围绕z轴旋转(0到359)。0=North, 90=East, 180=South, 270=West
values[1]: Pitch(俯仰),围绕X轴旋转(-180 to 180), 当Z轴向Y轴运动时是正值
values[2]: Roll(滚),围绕Y轴旋转(-90 to 90),当X轴向Z轴运动时是正值
㈨ android如何实现陀螺仪 sensor 在 android 吗
设备中的三自由度Orientation
Sensor就是一个可以识别设备相对于地面,绕x、y、z轴转动角度的感应器(自己的理解,不够严谨)。智能手机,平板电脑有了它,可以实现很多好玩的应用,比如说指南针等。
我们可以用一个磁场感应器(magnetic sensor)来实现。
磁场感应器是用来测量磁场感应强度的。一个3轴的磁sensor
IC可以得到当前环境下X、Y和Z方向上的磁场感应强度,对于Android中间层来说就是读取该感应器测量到的这3个值。当需要时,上报给上层应用程序。磁感应强度的单位是T(特斯拉)或者是Gs(高斯),1T等于10000Gs。
先来看看android定义的坐标系,在/hardware/libhardware/include/hardware/sensors.h中有个图。
求z和x的反正切可得到此值。
sensors.h中还定义了其他各种sensor。要实现的就是这两个:
#define SENSOR_TYPE_MAGNETIC_FIELD 2
#define SENSOR_TYPE_ORIENTATION 3
在/hardware/sensors/sensors.cpp 中添加对MAGNETIC_FIELD和ORIENTATION 的支持