实现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邮箱翻转效果之翻转动画

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值