首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android 應用開發:動漫名言收藏 APP 核心 Fragment 實現

     編輯:Java 相關知識

功能概覽

AcgDialogueFragment 負責展示單條動漫台詞,支援:

  • 系統預設台詞(含頭像圖片資源 ID、音效資源 ID)
  • 用戶自定義台詞(頭像為本地圖片路徑、音效為本地文件路徑)
  • 標點符號自動換行(,。?! → 換行)
  • 點擊頭像播放波紋動畫 + 播放對應音效
  • 缺失圖片/音效時的降級處理

核心代碼詳解 (onCreateView)

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_acg_dialogue, container, false);
    int id = (Integer) getArguments().getSerializable(EXTRA_ACG_ID);
    mAcg = AcgLab.get(getActivity()).getAcg(id);

    // 1. 台詞文本:標點換行
    mDialogueTextView = (TextView) v.findViewById(R.id.dialogue_tv);
    String dialogue = mAcg.getDialogue()
        .replace(",", "\n")
        .replace("。", "\n")
        .replace("?", "\n")
        .replace("!", "\n");
    mDialogueTextView.setText(dialogue);

    // 2. 角色名
    mPersonageTextView = (TextView) v.findViewById(R.id.personage_tv);
    if (!mAcg.getPersonage().isEmpty())
        mPersonageTextView.setText("--" + mAcg.getPersonage());
    else
        mPersonageTextView.setText("");

    // 3. 頭像圖片與點擊事件
    mHeadImageView = (ImageView) v.findViewById(R.id.avatar_iv);
    mRippleImageView = (ImageView) v.findViewById(R.id.ripple_iv);

    if (mAcg.getId() < AcgListFragment.SYSTEM_DIALODUE_LENGHT) {
        // 系統預設:資源 ID
        mHeadImageView.setImageResource(Integer.parseInt(mAcg.getHead()));
        mHeadImageView.setOnClickListener(v -> {
            // 波紋動畫
            Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_ripple);
            mRippleImageView.startAnimation(anim);
            // 播放音效 (資源 ID)
            AcgDialogueFragment.getPlayer().play(getActivity(), Integer.parseInt(mAcg.getSound()));
        });
    } else {
        // 用戶自定義:本地文件路徑
        File file = new File(mAcg.getHead());
        if (mAcg.getHead().isEmpty() || !file.exists()) {
            mHeadImageView.setImageResource(R.drawable.saber); // 默認頭像
        } else {
            Bitmap bmp = PictureUtils.getScaledBitmapFromPath(getActivity(), mAcg.getHead());
            bmp = PictureUtils.getRoundBitmap(bmp); // 圓形裁剪
            mHeadImageView.setImageBitmap(bmp);
        }
        mHeadImageView.setOnClickListener(v -> {
            Animation anim = AnimationUtils.loadAnimation(getActivity(), R.anim.anim_ripple);
            mRippleImageView.startAnimation(anim);
            if (mAcg.getId() < AcgListFragment.SYSTEM_DIALODUE_LENGHT) {
                AcgDialogueFragment.getPlayer().play(getActivity(), Integer.parseInt(mAcg.getSound()));
            } else {
                if (mAcg.getSound().isEmpty()) {
                    Toast.makeText(getActivity(), R.string.tip_not_sound, Toast.LENGTH_SHORT).show();
                } else {
                    AcgDialogueFragment.getPlayer().play(getActivity(), mAcg.getSound()); // 本地文件路徑
                }
            }
        });
    }
    return v;
}

關鍵工具類

  • AcgLab:單例數據倉庫,管理台詞列表(系統 + 用戶),提供 getAcg(id)。
  • PictureUtils:
    getScaledBitmapFromPath(Context, path):按屏幕密度縮放加載,防止 OOM。
    getRoundBitmap(Bitmap):使用 BitmapShader 或 Canvas.clipPath 實現圓形頭像。
  • AudioPlayer (單例):封裝 MediaPlayer / SoundPool,play(Context, int resId) 與 play(Context, String filePath) 統一調用入口。

佈局文件片段 (fragment_acg_dialogue.xml)

<FrameLayout ...>
    <ImageView android:id="@+id/avatar_iv" ... />
    <ImageView android:id="@+id/ripple_iv" android:src="@drawable/ripple" android:visibility="invisible" />
    <TextView android:id="@+id/dialogue_tv" android:textSize="16sp" ... />
    <TextView android:id="@+id/personage_tv" android:textSize="14sp" android:textColor="#888" ... />
</FrameLayout>

動畫資源 (res/anim/anim_ripple.xml)

<set xmlns:android="https://schemas.android.com/apk/res/android">
    <scale android:fromXScale="0.5" android:toXScale="2.0"
           android:fromYScale="0.5" android:toYScale="2.0"
           android:pivotX="50%" android:pivotY="50%"
           android:duration="600" />
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
           android:duration="600" />
</set>

設計亮點

  1. 統一交互入口:系統/用戶數據同樣通過 mHeadImageView.setOnClickListener 處理,邏輯內部分發。
  2. 資源類型屏蔽:上層只關心 play(Context, Object),下層自動識別資源 ID 或文件路徑。
  3. 圖片加載安全:用戶圖片經過 exists() 校驗、縮放、圓形裁剪,避免大圖 OOM 且統一風格。
  4. 優雅降級:缺失頭像顯示默認圖,缺失音效彈 Toast 提示而非崩潰。

擴展建議

  • 使用 Glide/Picasso 替換手工圖片加載,支援緩存、佔位圖、錯誤圖。
  • 引入 Room 數據庫持久化用戶台詞,替換內存單例。
  • 加入收藏/分享/複製文本功能(長按菜單)。
  • 支援多語言台詞(string 資源文件國際化)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved