Android屬性動畫實現(xiàn)圖片從左到右逐漸消失
前言:dp/dip代表獨(dú)立像素,dpi代表屏幕每英寸像素點(diǎn)的個數(shù),px與dp的轉(zhuǎn)換公式為: px = dp *(dpi / 160)
一、效果圖
二、源代碼
AnimationActivity:
package com.example.duoyi.clientaidl; import android.animation.Animator; import android.animation.ObjectAnimator; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.ImageView; import com.example.duoyi.AnimationAdapter; import java.util.ArrayList; import java.util.List; public class AnimationActivity extends AppCompatActivity { private static final int MAX_COUNT = 100; private static final String TAG = "AnimationActivity"; RecyclerView rv; CardView cv; ImageView image; ObjectAnimator animator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animation); rv = findViewById(R.id.itemRv); cv = findViewById(R.id.expand); image = findViewById(R.id.insect); List<String> list = new ArrayList<>(); for (int i = 0; i < MAX_COUNT; i++) { list.add("世界很美好,隊形走起" + i); } LinearLayoutManager manager = new LinearLayoutManager(this); manager.setOrientation(RecyclerView.VERTICAL); AnimationAdapter adapter = new AnimationAdapter(list, this); rv.setLayoutManager(manager); rv.setAdapter(adapter); rv.scrollToPosition(list.size() - 1); image.setTranslationX(dp2px(50)); //監(jiān)聽recyclerview的滑動事件 rv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); Log.i(TAG, "current scroll state = " + newState); image.setTranslationX(dp2px(-1)); if (newState == RecyclerView.SCROLL_STATE_IDLE) { //第一種動畫方式 // image.animate() // .translationX(dp2px(50)) // .setDuration(1500) // .start(); //第二種動畫方式 animator = ObjectAnimator.ofFloat(image, "translationX", dp2px(50)); animator.setDuration(1500); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { //當(dāng)圖片發(fā)生點(diǎn)擊時可以通過下面代碼將圖片復(fù)位到原來位置 //否則響應(yīng)點(diǎn)擊事件的圖片可能會顯示不全,不響應(yīng)點(diǎn)擊的忽略 //image.setTranslationX(dp2px(-1)); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); animator.start(); } } }); image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (animator != null && animator.isRunning()) { animator.cancel(); } image.setImageResource(R.drawable.insect); } }); } public int dp2px(int dip) { int dpi = getResources().getDisplayMetrics().densityDpi; return dip * (dpi / 160); } }
activity_animator.xml:
<?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" tools:context=".AnimationActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/itemRv" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.v7.widget.CardView android:id="@+id/expand" android:layout_width="70dp" android:layout_height="30dp" android:layout_alignParentEnd="true" android:layout_marginTop="40dp" android:layout_marginEnd="30dp" app:cardBackgroundColor="#00000000" app:cardCornerRadius="15dp" app:cardElevation="0dp"> <ImageView android:id="@+id/insect" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="end" android:scaleType="fitXY" android:src="@drawable/insect" /> </android.support.v7.widget.CardView> </RelativeLayout>
item_anim.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="50dp" tools:context=".AnimationActivity"> <TextView android:textSize="16sp" android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="hello World" /> </RelativeLayout>
AnimatorAdapter.java:
package com.example.duoyi; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.duoyi.clientaidl.AnimationActivity; import com.example.duoyi.clientaidl.R; import java.util.List; public class AnimationAdapter extends RecyclerView.Adapter<AnimationAdapter.AnimationViewHolder> { private List<String> list; private AnimationActivity context; public AnimationAdapter(List<String> list, AnimationActivity context) { this.list = list; this.context = context; } @Override public AnimationViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context).inflate(R.layout.item_anim, viewGroup, false); return new AnimationViewHolder(view); } @Override public void onBindViewHolder(AnimationViewHolder holder, int position) { String content = list.get(position); holder.content.setText(content); } @Override public int getItemCount() { return list.size(); } static class AnimationViewHolder extends RecyclerView.ViewHolder { TextView content; AnimationViewHolder(View view) { super(view); content = view.findViewById(R.id.content); } } }
三、邏輯分析
首先實現(xiàn)的效果是圖片從做到右顯示,那我們就使用平移動畫,讓圖片從左到右移動消失,所以就在需要顯示ImageView嵌套一層父容器,這樣圖片不斷移出容器的范圍內(nèi)就會造成一種圖片從左到右消失的效果
需求:父容器需設(shè)置為圓角顯示
如果需要實現(xiàn)ImageView的父容器為圓角布局的話,那就采用CardView,通過改變其屬性
app:cardCornerRadius="15dp"
實現(xiàn),不要使用其他諸如LinearLayout的父容器,設(shè)置其backgroud為一個圓角的drawable方式實現(xiàn),這樣的話內(nèi)部的圖片如果是矩形,即時你設(shè)置了父容器為圓角的,但是內(nèi)部圖片的顯示還是會超出圓角的范圍顯示
需求:圖片消失的動畫中響應(yīng)點(diǎn)擊事件,完整顯示另一張圖片
這個實現(xiàn)我們首先需要在圖片的點(diǎn)擊事件中判斷當(dāng)前動畫是否還是運(yùn)行isRunning(),如果運(yùn)行的話調(diào)用animator的cancel()方法取消動畫,然后進(jìn)行圖片的位置的復(fù)位;如果我們不進(jìn)行復(fù)位操作,此時ImageView的位置由于平移動畫發(fā)生改變,當(dāng)我們顯示另一張圖片可能會發(fā)生顯示不全情況
當(dāng)動畫終止(可能自然終止,也可能調(diào)用了動畫的cance()方法),會響應(yīng)其結(jié)束的監(jiān)聽方法,然后我們在該方法復(fù)位圖片的位置即可:
animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { //當(dāng)圖片發(fā)生點(diǎn)擊時可以通過下面代碼將圖片復(fù)位到原來位置 //否則響應(yīng)點(diǎn)擊事件的圖片可能會顯示不全,不響應(yīng)點(diǎn)擊的忽略 //image.setTranslationX(dp2px(-1)); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } });
動畫實現(xiàn)的兩種方式:
直接通過組件的animator()方式可以實現(xiàn)動畫的鏈?zhǔn)秸{(diào)用,并且可以通過其withEndAction()或者withStartAction()方法在動畫啟動和結(jié)束的時候執(zhí)行一些邏輯,該方式可以不需要調(diào)用其start()就能執(zhí)行,因為其會在屏幕刷新的時候會自動執(zhí)行
//第一種動畫方式 image.animate() .translationX(dp2px(50)) .setDuration(1500) .start();
下面這種方式就是比較老實的方式,但是我們可以通過將其賦值給一個全局變量進(jìn)行動畫的操控(pause() cancel())
animator = ObjectAnimator.ofFloat(image, "translationX", dp2px(50)); animator.setDuration(1500); animato.start();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:Android實現(xiàn)清除應(yīng)用緩存功能
欄 目:Android
下一篇:Android實現(xiàn) Shape屬性gradient 漸變效果
本文標(biāo)題:Android屬性動畫實現(xiàn)圖片從左到右逐漸消失
本文地址:http://mengdiqiu.com.cn/a1/Android/9059.html
您可能感興趣的文章
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應(yīng)用實現(xiàn)方法詳解
- 01-10android實現(xiàn)記住用戶名和密碼以及自動登錄
- 01-10android實現(xiàn)簡單計算器功能
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代碼
- 01-10android實現(xiàn)指紋識別功能
- 01-10Emoji表情在Android JNI中的兼容性問題詳解
- 01-10Android實現(xiàn)圓形漸變加載進(jìn)度條
- 01-10android開發(fā)環(huán)境中SDK文件夾下的所需內(nèi)容詳解
- 01-10android異步消息機(jī)制 源碼層面徹底解析(1)


閱讀排行
本欄相關(guān)
- 01-10Android自定義View之繪制圓形頭像功能
- 01-10Android實現(xiàn)雙擊返回鍵退出應(yīng)用實現(xiàn)方
- 01-10android實現(xiàn)簡單計算器功能
- 01-10android實現(xiàn)記住用戶名和密碼以及自動
- 01-10C++自定義API函數(shù)實現(xiàn)大數(shù)相乘算法
- 01-10Android 友盟第三方登錄與分享的實現(xiàn)代
- 01-10android實現(xiàn)指紋識別功能
- 01-10如何給Flutter界面切換實現(xiàn)點(diǎn)特效
- 01-10Android實現(xiàn)圓形漸變加載進(jìn)度條
- 01-10Emoji表情在Android JNI中的兼容性問題詳
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什