網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1、準(zhǔn)備工作
首先需要有一個(gè)用于旋轉(zhuǎn)的圖片
需要考慮如何開始、結(jié)束、加速、減速
2、加速減速原理
本次的動(dòng)畫采用RotateAnimation,初始化需要的參數(shù)如下
public RotateAnimation(float fromDegrees,float toDegrees,int pivotXType,float pivotXValue,int pivotYType, float pivotYValue) { mFromDegrees = fromDegrees;//開始角度 mToDegrees = toDegrees;//結(jié)束角度 mPivotXValue = pivotXValue;//確定x軸坐標(biāo)的類型 mPivotXType = pivotXType;//x軸的值,0.5f表明是以自身這個(gè)控件的一半長(zhǎng)度為x軸 mPivotYValue = pivotYValue;//確定y軸坐標(biāo)的類型 mPivotYType = pivotYType;//y軸的值,0.5f表明是以自身這個(gè)控件的一半長(zhǎng)度為y軸 initializePivotPoint(); }
所謂旋轉(zhuǎn)動(dòng)畫,在本質(zhì)上就是在如上的對(duì)象初始化之后,規(guī)定在一定的周期內(nèi)旋轉(zhuǎn)
所謂加速,本質(zhì)上就是在設(shè)定好的周期內(nèi)變換旋轉(zhuǎn)角度
或者修改周期,在預(yù)設(shè)周期內(nèi)旋轉(zhuǎn)一定角度
總之,角度和周期一定會(huì)變化一個(gè),就可以決定動(dòng)畫的快慢。
如: 從 2秒內(nèi)旋轉(zhuǎn)360度 到 1秒內(nèi)旋轉(zhuǎn)360度 就是一種加速,
從 2秒內(nèi)旋轉(zhuǎn)360度 到 2秒內(nèi)旋轉(zhuǎn)720度 也是一種加速。
反之就是減速。
3、初始化
RotateAnimation rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotate.setInterpolator(new LinearInterpolator()); rotate.setDuration(2000);//設(shè)置動(dòng)畫持續(xù)周期 rotate.setRepeatCount(-1);//設(shè)置重復(fù)次數(shù) // rotate.setFillAfter(true);//動(dòng)畫執(zhí)行完后是否停留在執(zhí)行完的狀態(tài) rotate.setStartOffset(10);//執(zhí)行前的等待時(shí)間
4、開始
start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fan.startAnimation(rotate); } });
5、加速
首先需要?jiǎng)?chuàng)建全局變量
private int duration=2000;
加速樣例
accelerate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (duration>10){ duration/=2; //周期除2角度不變加速(需要考慮極端,所以加一個(gè)判斷) } rotate.setDuration(duration); //設(shè)置周期 fan.startAnimation(rotate); //開始旋轉(zhuǎn) } });
6、減速
decelerate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (duration<10000){ duration*=2; //周期乘2角度不變減速(需要考慮極端,所以加一個(gè)判斷) } rotate.setDuration(duration); //設(shè)置周期 fan.startAnimation(rotate); //開始旋轉(zhuǎn) } });
7、停止
stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fan.clearAnimation(); //停止 } });
8、項(xiàng)目源碼
Layout部分
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#DEECFA" tools:context=".MainActivity"> <RelativeLayout android:layout_centerHorizontal="true" android:layout_marginTop="100dp" android:id="@+id/relativeLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@mipmap/border" tools:layout_editor_absoluteX="566dp" tools:layout_editor_absoluteY="132dp"> <ImageView android:id="@+id/fan" android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@mipmap/fan" tools:layout_editor_absoluteX="552dp" tools:layout_editor_absoluteY="122dp" /> </RelativeLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="150dp"> <Button android:id="@+id/start" android:layout_width="60dp" android:layout_height="60dp" android:background="@mipmap/border" android:text="開始" tools:layout_editor_absoluteX="525dp" tools:layout_editor_absoluteY="596dp" /> <Button android:id="@+id/accelerate" android:layout_marginLeft="100dp" android:layout_width="60dp" android:layout_height="60dp" android:background="@mipmap/border" android:text="加速" tools:layout_editor_absoluteX="650dp" tools:layout_editor_absoluteY="596dp" /> <Button android:layout_marginLeft="100dp" android:id="@+id/decelerate" android:layout_width="60dp" android:layout_height="60dp" android:background="@mipmap/border" android:text="減速" tools:layout_editor_absoluteX="795dp" tools:layout_editor_absoluteY="596dp" /> <Button android:id="@+id/stop" android:layout_marginLeft="100dp" android:layout_width="60dp" android:layout_height="60dp" android:background="@mipmap/border" android:text="結(jié)束" tools:layout_editor_absoluteX="950dp" tools:layout_editor_absoluteY="596dp" /> </LinearLayout> <ImageView android:layout_centerVertical="true" android:layout_marginLeft="90dp" android:id="@+id/imageView" android:layout_width="261dp" android:layout_height="527dp" app:srcCompat="@mipmap/title" tools:layout_editor_absoluteX="141dp" tools:layout_editor_absoluteY="132dp" /> </RelativeLayout>
MainActivity部分
package com.suk.rotate; import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDialog; import android.graphics.drawable.Drawable; import android.graphics.drawable.RotateDrawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.Toast; import com.suk.rotate.R; public class MainActivity extends AppCompatActivity { private ImageView fan; private Button start; private Button stop; private Button accelerate; private RotateAnimation rotate; private Button decelerate; private int duration=2000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fan = findViewById(R.id.fan); start = findViewById(R.id.start); stop = findViewById(R.id.stop); accelerate = findViewById(R.id.accelerate); decelerate = findViewById(R.id.decelerate); } @Override protected void onStart() { super.onStart(); rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotate.setInterpolator(new LinearInterpolator()); // rotate.setInterpolator(lin); rotate.setDuration(2000);//設(shè)置動(dòng)畫持續(xù)周期 rotate.setRepeatCount(-1);//設(shè)置重復(fù)次數(shù) // rotate.setFillAfter(true);//動(dòng)畫執(zhí)行完后是否停留在執(zhí)行完的狀態(tài) rotate.setStartOffset(10);//執(zhí)行前的等待時(shí)間 start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fan.startAnimation(rotate); } }); accelerate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (duration>10){ duration/=2;} rotate.setDuration(duration); fan.startAnimation(rotate); } }); decelerate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (duration<10000){ duration*=2;} rotate.setDuration(duration); fan.startAnimation(rotate); } }); /* fan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); dialog.setTitle("點(diǎn)我沒(méi)用"); dialog.setIcon(R.drawable.fan); dialog.setPositiveButton("OK",null); dialog.setMessage("這是普通對(duì)話框"); View view=View.inflate(MainActivity.this,R.layout. activity_main1, null); dialog.setView(view); dialog.create(); dialog.show(); } }); */ stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { fan.clearAnimation(); } }); } }
需要有三個(gè)圖片:
fan.png 風(fēng)扇扇葉
border.png 風(fēng)扇邊框
title.png 貼圖
(隨便找一個(gè)能看就行)
原文鏈接:https://blog.csdn.net/w_Eternal/article/details/122296375
相關(guān)推薦
- 2022-10-02 Opencv檢測(cè)多個(gè)圓形(霍夫圓檢測(cè),輪廓面積篩選)_C 語(yǔ)言
- 2022-10-18 AJAX跨域問(wèn)題解決方案詳解_AJAX相關(guān)
- 2023-03-11 Go語(yǔ)言break跳轉(zhuǎn)語(yǔ)句怎么使用_Golang
- 2022-10-19 C++線程安全容器stack和queue的使用詳細(xì)介紹_C 語(yǔ)言
- 2023-08-16 uniapp頁(yè)面返回到上一個(gè)頁(yè)面,更新其數(shù)據(jù)
- 2022-10-02 Redis進(jìn)行相關(guān)優(yōu)化詳解_Redis
- 2022-12-25 React?redux?原理及使用詳解_React
- 2022-10-29 python中正則表達(dá)式findall的用法實(shí)例_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支