并通过滑行方一向判断是还是不是需出示或者隐藏对应的布局,判断滑动方向ca88亚洲城网站

 

 

情节是博主照着书敲出来的,博主码字挺费劲的,转发请评释出处,后序内容陆续会码出。

ListView固然选取大规模,但系统原生的ListView显著是不可能满意用户在审美、作用上连发增进的须要。可是也不要紧,Android完全可以定制化,让我们更加便于地对原生ListView举办拓展、修改。于是,在开发者的更新下,ListView越来越丰富多彩,各个种种的依据原生ListView的进展令人目不暇接。下边来看多少个常用的ListView拓展。

 

 

具备弹性的ListView

Android默许的ListView在滚动到上边或者底端的时候,并没有很好的唤起。在Android5.X中,谷歌为这么的作为只添加了一个半月形的黑影效果,如下图所示。

ca88亚洲城网站 1

顶部阴影效果

  而在iOS系统中,列表都是拥有弹性效果的,即滚动到底端或者顶端后会继续往下依然往上滑动一段距离。不得不说,那样的筹划真正越发的温馨,就算不驾驭谷歌为啥不模仿那样的统筹,但大家得以友善修改ListView,让ListView也得以“弹性十足”。
  网上有不可胜举经过重写ListView来落到实处弹性效果的不二法门,比如扩张HeaderView或者使用ScrollView进行嵌套,方法有过多,可是那里可以使用一种分外不难的法子来贯彻这么些功能。就算不如那多少个方法可定制化高、效果丰盛,但第一目标是让读者朋友们学会怎样从源代码中找到标题标解决办法。
  大家在翻看ListView源代码的时候可以窥见,ListView中有一个操纵滑动到边缘的拍卖方式,如下所示。

protected boolean overScrollBy(int deltaX, int deltaY,
                               int scrollX, int scrollY,
                               int scrollRangeX, int scrollRangeY,
                               int maxOverScrollX, int maxOverScrollY,
                               boolean isTouchEvent)

可以望见如此一个参数:maxOverScrollY,注释中那样写道——Number of pixels
to overscroll by in either direction along the Y
axis。由此可以窥见,即使它的默许值是0,但实际上即便修改那些参数的值,就足以让ListView具有弹性了!所以,既然大家不清楚为什么谷歌(Google)不应用那样的改动,那我们就协调来修改一下吗。重写这么些法子,并将maxOverScrollY改为设置的值——m马克斯OverDistance,代码如下所示。

@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
    return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance, isTouchEvent);
}

如此那般,通过对那么些值得修改,就已毕了一个所有弹性的ListView了。效果如下图所示。

ca88亚洲城网站 2

弹性ListView效果

  当然,为了可以满意多分辨率的须要,我们可以在修改maxOverScrollY值的时候,可以经过屏幕的density来计量具体的值,让差别分辨率的弹性距离基本一致,代码如下所示。

private void initView() {
    DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
    float density = metrics.density;
    mMaxOverDistance = (int) (density * mMaxOverDistance);
}

依傍View的OnTouchListener接口来监听listView的滑行,通过相比较与上次坐标的分寸,判断滑动方向,并经过滑行方一直判定是或不是需出示或者隐藏对应的布局,并且包蕴动画效果。

看重View的OnTouchListener接口来监听listView的滑行,通过相比较与上次坐标的分寸,判断滑动方向,并通过滑行方平素判定是或不是需出示或者隐藏对应的布局,并且包蕴动画效果。

活动展现、隐藏布局的ListView

深信不疑经过谷歌(Google)+的对象应该非常熟练那样一个职能:当我们在ListView上滑动的时候,顶部的ActionBar或者Toolbar就会相应的隐没或者突显。那样的功力一出现,种种App竞相模仿,不得不说,谷歌(Google)的使用向来都是Android设计的风向标。
  我们能够窥见,在滚动前界面上加载了下面的标题栏和右下角的悬浮编辑按钮,如下图所示。

ca88亚洲城网站 3

滚动前界面

当用户向下滚动时,标题栏和浮泛按钮消失了,让用户有更大的长空去读书,如下图所示。

ca88亚洲城网站 4

滚动后界面

上面大家就来效仿那一个事例设计一个接近的意义。
  我们了解,让一个布局彰显或者隐藏并带有动画效果,可以经过属性动画来很便利地落到实处,所以这些效应的重点就在于怎样获取ListView的种种滑动事件。所以借助View的OnTouchListener接口来监听ListView的滑行,通过比较与上次坐标的深浅,来判定滑动的取向,并因而滑行的自由化来判断是不是须要出示或躲藏对应的布局。在开班判断滑动事件以前,大家还要做一些备选干活,首先须要给ListView增加一个HeaderView,防止首个Item被Toolbar遮挡,代码如下所示。

View header = new View(this);
header.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));
mListView.addHeaderView(header);

在代码中,通过行使abc_action_bar_default_height_material属性获取系统Actionbar的冲天,并设置给HeaderView。别的,定义一个mTouchSlop变量来博取系统认为的最低滑动距离,即超越那个距离的活动,系统就将其定义为滑行状态了,对那么些值得获得至极不难,代码如下所示。

mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();

有了眼前的备选工作,上面大家就足以看清滑动的事件了,关键代码如下所示。

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mFirstY = event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            mCurrentY = event.getY();
            if (mCurrentY - mFirstY > mTouchSlop) {
                // down
                if (mShow) {
                    toolbarAnim(0);
                }
                mShow = !mShow;
            } else if (mCurrentY - mFirstY < mTouchSlop) {
                // up
                if (mShow) {
                    toolbarAnim(1);
                }
                mShow = !mShow;
            }
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return false;

代码逻辑分外简单,只是经过滑动点的坐标改变大小,来判断移动的趋势,并根据活动方一向推行不一样的动画片效果。
  有了前头的辨析,已毕如此一个职能就非凡简单了,最终加上控制布局突显隐藏的卡通片,如下所示。

private void toolbarAnim(int flag) {
    if (mAnimator != null && mAnimator.isRunning()) {
        mAnimator.cancel();
    }
    if (flag == 0) {
        mAnimator = ObjectAnimator.ofFloat(mToolbar,
                "translationY", mToolbar.getTranslationY(), 0);
    } else {
        mAnimator = ObjectAnimator.ofFloat(mToolbar,
                "translationY", mToolbar.getTranslationY(),
                -mToolbar.getHeight());
    }
    mAnimator.start();
}

卡通也是最简易的位移属性动画。然则那里要求说一点题外话,那里运用了Toorbar那样一个新控件,谷歌已经引进它来日趋取代ActionBar了,因为它尤其灵活。但是在行使的时候,一定要留心运用的theme一定是要NoActionBar的,不然会引起龃龉。同时,不要遗忘引入编译,代码如下。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.4.0'
}

运转程序后起初状态如下图所示,Toorbar呈现在最上端。

ca88亚洲城网站 5

Toolbar显示

当发展滑动时,Toolbar隐藏,如下图所示。

ca88亚洲城网站 6

Toolbar隐藏

再向下滑动时,Toolbar突显。

 

 

聊天ListView

见惯司空我们接纳的ListView的每一项都兼备相同的布局,所以展现出来的时候,除了数据差异,只要你不隐藏布局,其余的布局应该都是看似的。而我辈驾驭的QQ、微信等聊天App,在聊天界面,会体现至少二种布局,即接到的信息和团结发送的音讯,其实这样的效果也是经过ListView来兑现的,上边大家就来效仿一个闲话软件的聊天列表界面,其职能如下图所示。

ca88亚洲城网站 7

聊天界面ListView

诸如此类一个ListView与我们平日所利用的ListView最大的两样,就是它具备五个差其余布局——收到的布局和发送的布局。要落实如此的作用,就要求拿ListView的Adapter“开刀”。
  在定义BaseAdapter的时候,须求去重写它的getView()方法,那几个措施就是用来赢得布局的,那么只要求在收获布局的时候,判断一下该得到哪类布局就可以了。而且,ListView在安插的时候就曾经考虑到了那种处境,所以它提供了多少个办法,代码如下所示。

@Override
public int getItemViewType(int position) {
    return super.getItemViewType(position);
}

@Override
public int getViewTypeCount() {
    return super.getViewTypeCount();
}

getItemViewType()方法用来回到第position个Item是何系列型,而getViewTypeCount()方法用来回到差距布局的总额。通过那七个法子,再组成getView()方法,就足以很轻松地安顿出地方的闲谈布局了。
  首先来促成七个布局——chat_item_itemin和chat_item_itemout。布局北海小异,只是方向上有不一样。需求留意的是,突显聊天音讯内容的TextView使用了9patch的图纸,那种图片格式是Android中用来拉伸图片的,你可以把它想象成在少数方向上拉伸却不会失真、形变的图样就可以了,布局代码如下所示。由于in和out界面内容只是样子上的界别,那里只贴出一个布局的代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="10dp">

    <ImageView
        android:id="@+id/icon_in"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/text_in"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/chatitem_in_bg"
        android:gravity="center"
        android:textSize="20sp" />

</LinearLayout>

并且,为了封装下聊天内容,便于在Adapter中获取数据音讯,大家封装了一个Bean来保存聊天音讯,代码如下所示。

import android.graphics.Bitmap;

/*********************************************
* author: Blankj on 2016/7/25 14:01
 * blog:   http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public class ChatListViewBean {

    private int type;
    private String text;
    private Bitmap icon;

    public ChatListViewBean() {
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Bitmap getIcon() {
        return icon;
    }

    public void setIcon(Bitmap icon) {
        this.icon = icon;
    }
}

极度简单,大家只是注明了亟需的信息并提供了get和set方法。
  接下去,须求来成功最重点的BaseAdapter了,同样利用ViewHolder形式来增进ListView的作用,并在getView()方法中进行布局项目标判定,从而确定使用哪个种类布局,代码如下所示。

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/*********************************************
 * author:  Blankj on 2016/7/25 14:01
 * blog:    http://blankj.com
 * e-mail:  blankj@qq.com
*********************************************/
public class ChatListViewAdapter extends BaseAdapter {

    private List<ChatListViewBean> mData;
    private LayoutInflater mInflater;

    public ChatListViewAdapter(Context context, List<ChatListViewBean> data) {
        this.mData = data;
        mInflater = LayoutInflater.from(context);
    }

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

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

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

    @Override
    public int getItemViewType(int position) {
        ChatListViewBean bean = mData.get(position);
        return bean.getType();
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            if (getItemViewType(position) == 0) {
                convertView = mInflater.inflate(R.layout.chat_item_itemin, null);
                viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_in);
                viewHolder.text = (TextView) convertView.findViewById(R.id.text_in);
            } else {
                convertView = mInflater.inflate(R.layout.chat_item_itemout, null);
                viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_out);
                viewHolder.text = (TextView) convertView.findViewById(R.id.text_out);
            }
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.icon.setImageBitmap(mData.get(position).getIcon());
        viewHolder.text.setText(mData.get(position).getText());
        return convertView;
    }

    public final class ViewHolder {
        public ImageView icon;
        public TextView text;
    }
}

在以上代码中,通过在getView()中判断getItemType(position)的值来控制具体实例化哪一个布局,从而完结在一个ListView中几个布局内容的增加。最终,在测试的Activity里面添加了有些测试代码,来测试那一个布局。

import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/*********************************************
* author: Blankj on 2016/7/25 13:30
 * blog:   http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public class ChatListViewTest extends Activity {

    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        mListView = (ListView) findViewById(R.id.lv_chat);

        ChatListViewBean bean1 = new ChatListViewBean();
        bean1.setType(0);
        bean1.setIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.in_icon));
        bean1.setText("Hello how are you?");

        ChatListViewBean bean2 = new ChatListViewBean();
        bean2.setType(1);
        bean2.setIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.out_icon));
        bean2.setText("Fine thank you, and you?");

        ChatListViewBean bean3 = new ChatListViewBean();
        bean3.setType(0);
        bean3.setIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.in_icon));
        bean3.setText("I am fine, too");

        ChatListViewBean bean4 = new ChatListViewBean();
        bean4.setType(1);
        bean4.setIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.out_icon));
        bean4.setText("Bye bye");

        ChatListViewBean bean5 = new ChatListViewBean();
        bean5.setType(0);
        bean5.setIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.in_icon));
        bean5.setText("See you");

        List<ChatListViewBean> data = new ArrayList<ChatListViewBean>();
        data.add(bean1);
        data.add(bean2);
        data.add(bean3);
        data.add(bean4);
        data.add(bean5);
        mListView.setAdapter(new ChatListViewAdapter(this, data));
    }
}

在测试代码中,简单地添加了有的仿照的扯淡内容,并将新闻打包到安装的Bean对象中,最终运行程序,即可得到之前所示的拉扯效果界面。

1.机关突显隐藏Toolbar

1.活动突显隐藏Toolbar

动态改变ListView布局

一般而言状态下,假设要动态地改变点击Item的布局来达到一个Focus的效能,一般有二种办法。一种是将三种布局写在一块儿,通过控制布局的来得、隐藏,来达成切换布局的成效;另一种则是在getView()的时候,通过判断来采用加载区其余布局。三种办法各有利弊,关键依然看使用的场子。上边就以第三种情势,来演示一下这么的效劳,程序运行后伊始效果下图所示,首个Item为默许Focus状态。

ca88亚洲城网站 8

次第伊始状态

  当点击任何Item的时候,点击的Item变为Focus状态,其他Item还原,效果如下图所示。

ca88亚洲城网站 9

Focus改变

该意义落实的关键依然在于BaseAdapter。在那么些实例中,通过如下所示的多少个主意来给Item设置三种分歧的布局——Focus和诺玛l。

private View addFocusView(int i) {
    ImageView iv = new ImageView(mContext);
    iv.setImageResource(R.mipmap.ic_launcher);
    return iv;
}

private View addNormalView(int i) {
    LinearLayout layout = new LinearLayout(mContext);
    layout.setOrientation(LinearLayout.HORIZONTAL);
    ImageView iv = new ImageView(mContext);
    iv.setImageResource(R.drawable.in_icon);
    layout.addView(iv, new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
    TextView tv = new TextView(mContext);
    tv.setText(mData.get(i));
    layout.addView(tv, new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
    layout.setGravity(Gravity.CENTER);
    return layout;
}

在那八个方法中,可以依照Item地方的不等来设置差其他来得图片等音信,但此间为了有利于,就联合只显示一张图片。
  上边回到BaseAdapter,在getView()方法中,通过判断点击的职位来改变相应的视图,代码如下所示。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout layout = new LinearLayout(mContext);
    layout.setOrientation(LinearLayout.VERTICAL);
    if (mCurrentItem == position) {
        layout.addView(addFocusView(position));
    } else {
        layout.addView(addNormalView(position));
    }
    return layout;
}

在上述代码中,通过判断当前CurrentItem是还是不是是点击的要命position,就足以动态控制突显的布局了。当然,仅仅那样是不够的,因为getView()是在初步化的时候调用,前面再点击Item的时候,并从未再次调用getView()。所以,必须要让ListView在点击后,再刷新一遍。于是我们请出了notifyDataSetChanged()方法来提携已毕刷新布局的职能,代码如下所示。

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                mAdapter.setCurrentItem(position);
                mAdapter.notifyDataSetChanged();
            }
        });

项目地址→ListViewExpandation


原文地址ListView常用拓展(Android群英传)
本人的自媒体博客blankj小站(OJ、LeetCode、Android开发),欢迎来逛逛。

     首先给listView增添一个HeaderView,防止第四个Item被Toolbar遮挡。

     首先给listView增添一个HeaderView,避免首个Item被Toolbar遮挡。

1 View header=new View(this);
2         header.setLayoutParams(new AbsListView.LayoutParams(
3                 AbsListView.LayoutParams.MATCH_PARENT,
4                 (int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));
5         mListView.addHeaderView(header);
1 View header=new View(this);
2         header.setLayoutParams(new AbsListView.LayoutParams(
3                 AbsListView.LayoutParams.MATCH_PARENT,
4                 (int)getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));
5         mListView.addHeaderView(header);

//R.dimen.abc_action_bar_default_height_material为系统ActionBar的高度

//R.dimen.abc_action_bar_default_height_material为系统ActionBar的高度

       概念一个mTouchSlop变量,获取系统认为的最低滑动距离

       概念一个mTouchSlop变量,获取系统认为的最低滑动距离

1 mTouchSlop=ViewConfiguration.get(this).getScaledTouchSlop();//系统认为的最低滑动距离
1 mTouchSlop=ViewConfiguration.get(this).getScaledTouchSlop();//系统认为的最低滑动距离

      

      

       判断滑动事件

       判断滑动事件

 

 

 1 bbsListView.setOnTouchListener(new OnTouchListener() {
 2             
 3             @Override
 4             public boolean onTouch(View v, MotionEvent event) {
 5
 6                 switch (event.getAction()) 
 7                 {
 8                 case MotionEvent.ACTION_DOWN:
 9                     mFirstY=event.getY();
10                     break;
11                 case MotionEvent.ACTION_MOVE:
12                     mCurrentY=event.getY();
13                     if(mCurrentY-mFirstY>mTouchSlop)
14                         direction=0; //listView向下滑动
15                     else if(mFirstY-mCurrentY>mTouchSlop)
16                         direction=1; //listView向上滑动
17                     if(direction==1)
18                     {
19                         if(mShow)
20                         {
21                             toolbarAnim(1); //隐藏上方的view
22                             mShow=!mShow;
23                         }
24                     }
25                     else if(direction==0)
26                     {
27                         if(!mShow)
28                         {
29                             toolbarAnim(0); //展示上方的view
30                             mShow=!mShow;
31                         }
32                     }
33                 case MotionEvent.ACTION_UP:
34                     break;
35                 }
36                 return false;
37             }
38         });
39     }
 1 bbsListView.setOnTouchListener(new OnTouchListener() {
 2             
 3             @Override
 4             public boolean onTouch(View v, MotionEvent event) {
 5
 6                 switch (event.getAction()) 
 7                 {
 8                 case MotionEvent.ACTION_DOWN:
 9                     mFirstY=event.getY();
10                     break;
11                 case MotionEvent.ACTION_MOVE:
12                     mCurrentY=event.getY();
13                     if(mCurrentY-mFirstY>mTouchSlop)
14                         direction=0; //listView向下滑动
15                     else if(mFirstY-mCurrentY>mTouchSlop)
16                         direction=1; //listView向上滑动
17                     if(direction==1)
18                     {
19                         if(mShow)
20                         {
21                             toolbarAnim(1); //隐藏上方的view
22                             mShow=!mShow;
23                         }
24                     }
25                     else if(direction==0)
26                     {
27                         if(!mShow)
28                         {
29                             toolbarAnim(0); //展示上方的view
30                             mShow=!mShow;
31                         }
32                     }
33                 case MotionEvent.ACTION_UP:
34                     break;
35                 }
36                 return false;
37             }
38         });
39     }

      属性动画

      属性动画

 1 protected void toolbarAnim(int flag) 
 2     {
 3         
 4         
 5         if(set!=null && set.isRunning())
 6         {
 7             set.cancel();
 8         }
 9         if(flag==0)
10         {
11         
12 
13             mAnimator1=ObjectAnimator.ofFloat(mToolbar, 
14                     "translationY", linearView.getTranslationY(),0);
15             mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 0f,1f);
16         }
17         else if(flag==1)
18         {
19             
20         
21             mAnimator1=ObjectAnimator.ofFloat(mToolbar, 
22                     "translationY", linearView.getTranslationY(),-linearView.getHeight());
23             mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 1f,0f);
24             
25         }
26         set=new AnimatorSet();
27         set.playTogether(mAnimator1,mAnimator2);
28         set.start();
29         
30 }
 1 protected void toolbarAnim(int flag) 
 2     {
 3         
 4         
 5         if(set!=null && set.isRunning())
 6         {
 7             set.cancel();
 8         }
 9         if(flag==0)
10         {
11         
12 
13             mAnimator1=ObjectAnimator.ofFloat(mToolbar, 
14                     "translationY", linearView.getTranslationY(),0);
15             mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 0f,1f);
16         }
17         else if(flag==1)
18         {
19             
20         
21             mAnimator1=ObjectAnimator.ofFloat(mToolbar, 
22                     "translationY", linearView.getTranslationY(),-linearView.getHeight());
23             mAnimator2=ObjectAnimator.ofFloat(mToolbar, "alpha", 1f,0f);
24             
25         }
26         set=new AnimatorSet();
27         set.playTogether(mAnimator1,mAnimator2);
28         set.start();
29         
30 }

//下边为位移还有透明度属性动画

//下边为位移还有透明度属性动画

应用的时候theme要用NoActionBar的,不然会滋生冲突。同时引入编译

运用的时候theme要用NoActionBar的,不然会挑起顶牛。同时引入编译

1 dependencies{
2      compile fileTree(include:['*.jar'],dir:'libs')
3      compile 'com.android.support:appcompat-v7:21.0.3'
4 }
1 dependencies{
2      compile fileTree(include:['*.jar'],dir:'libs')
3      compile 'com.android.support:appcompat-v7:21.0.3'
4 }

2.当要藏匿和显示的零件不是toolbar,而是我们自定义的布局myView时,需求专注一些点,

2.当要藏匿和出示的组件不是toolbar,而是大家自定义的布局myView时,必要注意一些点,

      (1) 布局要用相对布局,让大家自定义的布局悬浮在listView上方。

      (1) 布局要用相对布局,让大家自定义的布局悬浮在listView上方。

      (2)幸免第三个Item被myView遮挡,给listView扩大一个HeaderView,此时亟需测量myView的中度,要用上边那种措施,把任务post到UI线程中,不然执行会出错。

      (2)防止第四个Item被myView遮挡,给listView增添一个HeaderView,此时内需测量myView的莫大,要用上面那种方法,把职责post到UI线程中,不然执行会出错。

final View header=new View(this); //给listView增加一个headView,避免第一个item被遮挡
 header.post(new Runnable() {
    public void run() {
                 header.setLayoutParams(new AbsListView.LayoutParams(                             
                 AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
            }
       });
final View header=new View(this); //给listView增加一个headView,避免第一个item被遮挡
 header.post(new Runnable() {
    public void run() {
                 header.setLayoutParams(new AbsListView.LayoutParams(                             
                 AbsListView.LayoutParams.MATCH_PARENT, myView.getHeight()));
            }
       });

其余的与toolbar一样

任何的与toolbar一样

 

 

相关文章