實現Gmail郵箱翻轉效果之開篇

前言

之前在研究學習gmail翻轉效果,Android原生Email也有選中翻轉效果。可惜源碼複雜,時間會很久。
幸好,在github上尋找到TextDrawable,基於該lib實現自己的gmail翻轉效果。完整的代碼查github

文章列表

以下文章是github文章的分解,力求講清楚類gMail效果如何實現。

gMail效果圖

標記 “1” 效果,郵件聯繫人首字符大寫圓形多彩顯示
標記 “2” 點擊具有圖片翻轉效果
標記 “3” ActionBar顯示選中數量以及菜單

FlipView效果圖

TextDrawable & FlipView

如上圖gmail顯示那樣,實現標記 “1” 使用TextDrawable這個開源小庫 TextDrawable
作者實現的功能比較多樣,圓形,方形,圓角方形等等。顏色隨意搭配,可自己選擇。

FlipView是在原作者Sample基礎上添加動畫效果,以及ActionBar樣式。

TextDrawable只有2個類:

  • TextDrawable.java //繼承自Drawable的類,使用多種圖形顯示text.
  • ColorGenerator.java //顏色生成類

目錄結構說明

  • library TextDrawable源碼庫
  • sample 原作者的sample
  • flipview 本人實現的Demo
  • sample-apk apk文件目錄

FlipView說明

Demo FlipView的代碼結構。

  • HomeActivity是主Activity, 其中包含了ListView。
  • SampleAdapter 自定義Adapter,用於顯示Item,動畫翻轉效果。

FlipView實作

flipview是獨立的Apk, 以該Apk爲例子說明,一步一步實現gMail翻轉效果。
具體創建Apk,不用多說, 需要注意的是本作使用SDK 23,最小SDK 15.

集成TextDrawable

TextDrawable是原作者寫的小庫,用各種圖形顯示文本信息。可以直接使用庫文件代碼或是使用Android Studio的
依賴集成。
在build.gradle(flipview文件夾)中添加如下內容:

    //add maven repositories
    repositories{
        maven {
            url 'http://dl.bintray.com/amulyakhare/maven'
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.0.1'
        compile 'com.android.support:design:23.0.1'
        //add textdrawable
        compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
    }

基礎代碼搭建

這裏複用sample中的SampleAdapter

    public class SampleAdapter extends BaseAdapter {
        private static final int HIGHLIGHT_COLOR = 0x999be6ff;

        private Context mContext;

        // declare the color generator and drawable builder
        private ColorGenerator mColorGenerator;
        private TextDrawable.IBuilder mDrawableBuilder;

        SampleAdapter(Context context) {
            mContext = context;

            mColorGenerator = ColorGenerator.MATERIAL;
            mDrawableBuilder = TextDrawable.builder().round();
        }

        // list of data items
        private List<ListData> mDataList = Arrays.asList(
                new ListData("Iron Man"),
                new ListData("Captain America"),
                new ListData("James Bond"),
                new ListData("Harry Potter"),
                new ListData("Sherlock Holmes"),
                new ListData("Black Widow"),
                new ListData("Hawk Eye"),
                new ListData("Iron Man"),
                new ListData("Guava"),
                new ListData("Tomato"),
                new ListData("Pineapple"),
                new ListData("Strawberry"),
                new ListData("Watermelon"),
                new ListData("Pears"),
                new ListData("Kiwi"),
                new ListData("Plums")
        );

        @Override
        public int getCount() {
            return mDataList.size();
        }

        @Override
        public ListData getItem(int position) {
            return mDataList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(mContext, R.layout.list_item_layout, null);
                holder = new ViewHolder(convertView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            ListData item = getItem(position);

            // provide support for selected state
            updateCheckedState(holder, item);
            holder.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // when the image is clicked, update the selected state
                    ListData data = getItem(position);
                    data.setChecked(!data.isChecked);
                    updateCheckedState(holder, data);
                }
            });
            holder.textView.setText(item.data);

            return convertView;
        }

        private static class ListData {

            private String data;

            private boolean isChecked;

            public ListData(String data) {
                this.data = data;
            }

            public void setChecked(boolean isChecked) {
                this.isChecked = isChecked;
            }
        }

        private static class ViewHolder {

            private View view;

            private ImageView imageView;

            private TextView textView;

            private ImageView checkIcon;

            private ViewHolder(View view) {
                this.view = view;
                imageView = (ImageView) view.findViewById(R.id.imageView);
                textView = (TextView) view.findViewById(R.id.textView);
                checkIcon = (ImageView) view.findViewById(R.id.check_icon);
            }
        }

        private void updateCheckedState(ViewHolder holder, ListData item) {
            if (item.isChecked) {
                holder.imageView.setImageDrawable(mDrawableBuilder.build(" ", 0xff616161));
                holder.view.setBackgroundColor(HIGHLIGHT_COLOR);
                holder.checkIcon.setVisibility(View.VISIBLE);
            } else {
                TextDrawable drawable = mDrawableBuilder.build(String.valueOf(item.data.charAt(0)), mColorGenerator.getColor(item.data));
                holder.imageView.setImageDrawable(drawable);
                holder.view.setBackgroundColor(Color.TRANSPARENT);
                holder.checkIcon.setVisibility(View.GONE);
            }
        }
    }

基本的listview adapter模型。需要指出,使用了TextDrawable。

    import com.amulyakhare.textdrawable.TextDrawable;
    import com.amulyakhare.textdrawable.util.ColorGenerator;

使用方法簡單。需要決定Item imageView最左邊圖形形狀以及隨機的顏色, Demo使用圓形.

    mColorGenerator = ColorGenerator.MATERIAL;
    mDrawableBuilder = TextDrawable.builder().round();

原作者是沒有實現翻轉動畫效果的,僅僅使用2張圖片輪替。

    <FrameLayout
        android:layout_marginRight="16dp"
        android:layout_width="60dp"
        android:layout_height="60dp">

        <ImageView
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:id="@+id/imageView"/>

        <ImageView
            android:visibility="gone"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:src="@drawable/check_sm"
            android:id="@+id/check_icon"/>
    </FrameLayout>

    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:id="@+id/textView"/>

我的實現方式只需要一個imageview,讓該imageview實現翻轉。check_icon這個view不再使用。

下篇介紹 實現Gmail郵箱翻轉效果之翻轉動畫

發佈了57 篇原創文章 · 獲贊 17 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章