本節(jié)引言:
1.幀動(dòng)畫概念以及用法
2.使用示例:示例一:最簡(jiǎn)單的例子:運(yùn)行效果圖: 代碼實(shí)現(xiàn): 首先編寫我們的動(dòng)畫文件,非常簡(jiǎn)單,先在res下創(chuàng)建一個(gè)anim目錄,接著開始擼我們的 動(dòng)畫文件:miao_gif.xml: 這里的android:oneshot是設(shè)置動(dòng)畫是否只是播放一次,true只播放一次,false循環(huán)播放! <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas./apk/res/android" android:oneshot="false"> <item android:drawable="@mipmap/img_miao1" android:duration="80" /> <item android:drawable="@mipmap/img_miao2" android:duration="80" /> <item android:drawable="@mipmap/img_miao3" android:duration="80" /> <!--限于篇幅,省略其他item,自己補(bǔ)上--> ... </animation-list> 動(dòng)畫文件有了,接著到我們的布局文件:activity_main.xml: <LinearLayout xmlns:android="http://schemas./apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="開始" /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> <ImageView android:id="@+id/img_show" android:layout_width="120dp" android:layout_height="120dp" android:layout_gravity="center" android:background="@anim/miao_gif" /> </LinearLayout> 最后是我們的MainActivity.java,這里在這里控制動(dòng)畫的開始以及暫停: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_start; private Button btn_stop; private ImageView img_show; private AnimationDrawable anim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); anim = (AnimationDrawable) img_show.getBackground(); } private void bindViews() { btn_start = (Button) findViewById(R.id.btn_start); btn_stop = (Button) findViewById(R.id.btn_stop); img_show = (ImageView) findViewById(R.id.img_show); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start: anim.start(); break; case R.id.btn_stop: anim.stop(); break; } } } 好的,非常的簡(jiǎn)單哈~ 示例二:在指定地方播放幀動(dòng)畫運(yùn)行效果圖: 代碼實(shí)現(xiàn): 依舊是先上我們的動(dòng)畫文件:anim_zhuan.xml: <animation-list xmlns:android="http://schemas./apk/res/android" android:oneshot="true"> <item android:drawable="@mipmap/img_zhuan1" android:duration="80" /> <item android:drawable="@mipmap/img_zhuan2" android:duration="80" /> <item android:drawable="@mipmap/img_zhuan3" android:duration="80" /> <!--限于篇幅,省略其他item,自己補(bǔ)上--> ... </animation-list> 接著我們來(lái)寫一個(gè)自定義的ImageView:FrameView.java,這里通過(guò)反射獲得當(dāng)前播放的幀, 然后是否為最后一幀,是的話隱藏控件! /** * Created by Jay on 2015/11/15 0015. */ public class FrameView extends ImageView { private AnimationDrawable anim; public FrameView(Context context) { super(context); } public FrameView(Context context, AttributeSet attrs) { super(context, attrs); } public FrameView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setAnim(AnimationDrawable anim){ this.anim = anim; } public void setLocation(int top,int left){ this.setFrame(left,top,left + 200,top + 200); } @Override protected void onDraw(Canvas canvas) { try{ //反射調(diào)用AnimationDrawable里的mCurFrame值 Field field = AnimationDrawable.class .getDeclaredField("mCurFrame"); field.setAccessible(true); int curFrame = field.getInt(anim);// 獲取anim動(dòng)畫的當(dāng)前幀 if (curFrame == anim.getNumberOfFrames() - 1)// 如果已經(jīng)到了最后一幀 { //讓該View隱藏 setVisibility(View.INVISIBLE); } }catch (Exception e){e.printStackTrace();} super.onDraw(canvas); } } 最后是我們的MainActivity.java,創(chuàng)建一個(gè)FrameLayout,添加View,對(duì)觸摸事件中按下的 事件做處理,顯示控件以及開啟動(dòng)畫~ public class MainActivity extends AppCompatActivity { private FrameView fView; private AnimationDrawable anim = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout fly = new FrameLayout(this); setContentView(fly); fView = new FrameView(this); fView.setBackgroundResource(R.anim.anim_zhuan); fView.setVisibility(View.INVISIBLE); anim = (AnimationDrawable) fView.getBackground(); fView.setAnim(anim); fly.addView(fView); fly.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //設(shè)置按下時(shí)才產(chǎn)生動(dòng)畫效果 if(event.getAction() == MotionEvent.ACTION_DOWN){ anim.stop(); float x = event.getX(); float y = event.getY(); fView.setLocation((int) y - 40,(int)x-20); //View顯示的位置 fView.setVisibility(View.VISIBLE); anim.start(); //開啟動(dòng)畫 } return false; } }); } } 好的,同樣很簡(jiǎn)單哈~ 3.本節(jié)示例代碼和Gif幀提取工具下載本節(jié)小結(jié):
|
|
來(lái)自: 小飛苑 > 《android基礎(chǔ)》