日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Animation实现元素在屏幕上按照指定轨迹运动,以及出现NullPointerException的解决方案

發布時間:2023/12/15 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Animation实现元素在屏幕上按照指定轨迹运动,以及出现NullPointerException的解决方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因項目需要,在Android中實現了一個動畫,當在Activity中點擊特定按鈕時,會在屏幕上添加一個ImageView,并按照指定的起點、終點,沿著特定的軌跡運動(例如直線)。

實現方法

實現思路是在Activity的DecorView中添加一個FrameLayout,然后在FrameLayout中添加ImageView,可通過Margin參數指定ImageView的起始位置。然后設置ImageView的動畫,使其能運動到終點。當動畫結束后,移除FrameLayout。

核心代碼如下。項目GitHub鏈接?https://github.com/jzj1993/AnimationCrash

  • public static boolean startAnim(Activity activity, int fromX, int toX, int fromY, int toY) {
  • try {
  • final ImageView img = new ImageView(activity);
  • img.setImageResource(R.mipmap.ic_launcher);
  • final FrameLayout tempLayout = new FrameLayout(activity);
  • final FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
  • FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
  • lp.setMargins(fromX, fromY, 0, 0);
  • tempLayout.addView(img, lp);
  • final ViewGroup container = (ViewGroup) activity.getWindow().getDecorView();
  • container.addView(tempLayout, new ViewGroup.LayoutParams(
  • ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
  • final Animation anim = new TranslateAnimation(0, toX - fromX, 0, toY - fromY);
  • anim.setDuration(500);
  • anim.setAnimationListener(new Animation.AnimationListener() {
  • @Override
  • public void onAnimationStart(Animation animation) {
  • }
  • @Override
  • public void onAnimationEnd(Animation animation) {
  • container.removeView(tempLayout);
  • }
  • @Override
  • public void onAnimationRepeat(Animation animation) {
  • }
  • });
  • img.startAnimation(anim);
  • } catch (Exception e) {
  • e.printStackTrace();
  • }
  • return true;
  • }
  • 錯誤描述

    在大部分安卓手機上運行正常,但是在部分Android 4.0.x系統中(例如Nexus S Android 4.0.3模擬器),如果連續同時執行多個動畫,可能會出現NullPointerException,如下:

  • com.jzj1993.anim E/AndroidRuntime FATAL EXCEPTION: main
  • java.lang.NullPointerException
  • at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2488)
  • at android.view.View.draw(View.java:10981)
  • at android.widget.FrameLayout.draw(FrameLayout.java:450)
  • at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2126)
  • ? ? ? ? ? ? at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026)
  • ? ? ? ? ? ? at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
  • ? ? ? ? ? ? at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
  • ? ? ? ? ? ? at android.os.Handler.dispatchMessage(Handler.java:99)
  • ? ? ? ? ? ? at android.os.Looper.loop(Looper.java:137)
  • ? ? ? ? ? ? at android.app.ActivityThread.main(ActivityThread.java:4424)
  • ? ? ? ? ? ? at java.lang.reflect.Method.invokeNative(Native Method)
  • ? ? ? ? ? ? at java.lang.reflect.Method.invoke(Method.java:511)
  • ? ? ? ? ? ? at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  • at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  • at dalvik.system.NativeStart.main(Native Method)
  • 解決方法

    將以下代碼

  • @Override
  • public void onAnimationEnd(Animation animation) {
  • container.removeView(tempLayout);
  • }
  • 改為:

  • @Override
  • public void onAnimationEnd(Animation animation) {
  • container.post(new Runnable() {
  • @Override
  • public void run() {
  • container.removeView(tempLayout);
  • }
  • });
  • }
  • 原因分析

    以下是官方給出的ViewGroup.removeView方法的JavaDoc注釋:

  • public void removeView (View view)
  • Added in API level 1
  • Note: do not invoke this method from draw(android.graphics.Canvas), onDraw(android.graphics.Canvas), dispatchDraw(android.graphics.Canvas) or any related method.
  • 猜測在同時執行多個動畫時,前一個動畫的onAnimationEnd被回調時,后一個動畫正在執行,因此DecorView的onDraw方法在執行,可能會導致DecorView.onDraw執行時,onAnimationEnd回調中的DecorView.removeView方法被調用,從而導致錯誤。沒有具體深入的去分析源碼,但是經過驗證問題確實解決了。

    本文由jzj1993原創,轉載請注明來源:http://www.paincker.com/android-animation-crash

    總結

    以上是生活随笔為你收集整理的Android Animation实现元素在屏幕上按照指定轨迹运动,以及出现NullPointerException的解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。