㈠ 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 的支持