Android:在向下/向上滚动listview时使用动画隐藏RelativeLayout

Android:在向下/向上滚动listview时使用动画隐藏RelativeLayout,android,android-layout,android-listview,android-animation,Android,Android Layout,Android Listview,Android Animation,我尝试实现一个用于隐藏listview上方的relativeLayout的动画。我希望有这样的行为: 向下滚动时:隐藏RelativeLayout 向上滚动:仅当我在顶部时显示RelativeLayout 我创建的以下代码有效,但存在两个问题: 当我向下滚动或向上滚动时,如果我在listview的顶部,则relativelayout会闪烁。我必须执行快速滚动以隐藏此爬升。=>我的代码中有一个问题,可能是listIsAtTop()函数的问题 第二个问题,我没有动画。我使用setVisivil

我尝试实现一个用于隐藏listview上方的relativeLayout的动画。我希望有这样的行为:

  • 向下滚动时:隐藏RelativeLayout
  • 向上滚动:仅当我在顶部时显示RelativeLayout

我创建的以下代码有效,但存在两个问题:

  • 当我向下滚动或向上滚动时,如果我在listview的顶部,则relativelayout会闪烁。我必须执行快速滚动以隐藏此爬升。=>我的代码中有一个问题,可能是listIsAtTop()函数的问题
  • 第二个问题,我没有动画。我使用setVisivility(可见或消失)来显示或隐藏relativeLayout。它对用户不友好,不是吗?:)我不知道如何添加一点翻译动画来隐藏和显示这个相对论
  • 在Account\u活动类的onCreate()中:

    list = (com.app.frisbeee.account_view.CustomListView)findViewById(R.id.accountview_listview);
    adapter = new Account_view_custom_adapter(Account_view_act.this, annoncesList);
                list.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                registerForContextMenu(list);
    
                list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        list.showContextMenuForChild(view);   
                    }
                });
    
                list.setOnDetectScrollListener(new OnDetectScrollListener() {
                    @Override
                    public void onUpScrolling() {
                        /* do something */
                        Log.d("INFO", "UPPPPPPPPPPP");
                        if (listIsAtTop()) {
                            RelativeLayout relative1 = (RelativeLayout) findViewById(R.id.relative1);
                            relative1.setVisibility(View.VISIBLE);
                        }
                    }
    
                    @Override
                    public void onDownScrolling() {
                        /* do something */
                        Log.d("INFO", "DOWNNNNNNNN");
                        if (!listIsAtTop()) {
                            RelativeLayout relative1 = (RelativeLayout) findViewById(R.id.relative1);
                            relative1.setVisibility(View.GONE);
                        }
    
                    }
                });
    
            }
    
    private boolean listIsAtTop()   {   
            if (list.getChildCount() == 0) {
                return true;
            }
            return list.getFirstVisiblePosition() == 0 && (list.getChildCount() == 0 || list.getChildAt(0).getTop() == 0);
        }
    
    private boolean listIsAtTop()   {   
        if(listView.getChildCount() == 0) return true;
        return listView.getChildAt(0).getTop() == 0;
    }
    
    CustomListView用于检测上下滚动:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.AbsListView;
    
    public class CustomListView extends android.widget.ListView {
    
        private OnScrollListener onScrollListener;
        private OnDetectScrollListener onDetectScrollListener;
    
        public CustomListView(Context context) {
            super(context);
            onCreate(context, null, null);
        }
    
        public CustomListView(Context context, AttributeSet attrs) {
            super(context, attrs);
            onCreate(context, attrs, null);
        }
    
        public CustomListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            onCreate(context, attrs, defStyle);
        }
    
        private void onCreate(Context context, AttributeSet attrs, Integer defStyle) {
            setListeners();
        }
    
        private void setListeners() {
            super.setOnScrollListener(new OnScrollListener() {
    
                private int oldTop;
                private int oldFirstVisibleItem;
    
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    if (onScrollListener != null) {
                        onScrollListener.onScrollStateChanged(view, scrollState);
                    }
                }
    
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                    if (onScrollListener != null) {
                        onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
                    }
    
                    if (onDetectScrollListener != null) {
                        onDetectedListScroll(view, firstVisibleItem);
                    }
                }
    
                private void onDetectedListScroll(AbsListView absListView, int firstVisibleItem) {
                    View view = absListView.getChildAt(0);
                    int top = (view == null) ? 0 : view.getTop();
    
                    if (firstVisibleItem == oldFirstVisibleItem) {
                        if (top > oldTop) {
                            onDetectScrollListener.onUpScrolling();
                        } else if (top < oldTop) {
                            onDetectScrollListener.onDownScrolling();
                        }
                    } else {
                        if (firstVisibleItem < oldFirstVisibleItem) {
                            onDetectScrollListener.onUpScrolling();
                        } else {
                            onDetectScrollListener.onDownScrolling();
                        }
                    }
    
                    oldTop = top;
                    oldFirstVisibleItem = firstVisibleItem;
                }
            });
        }
    
        @Override
        public void setOnScrollListener(OnScrollListener onScrollListener) {
            this.onScrollListener = onScrollListener;
        }
    
        public void setOnDetectScrollListener(OnDetectScrollListener onDetectScrollListener) {
            this.onDetectScrollListener = onDetectScrollListener;
        }
    }
    
    导入android.content.Context;
    导入android.util.AttributeSet;
    导入android.view.view;
    导入android.widget.AbsListView;
    公共类CustomListView扩展了android.widget.ListView{
    私有OnScrollListener OnScrollListener;
    私有OnDetectScrollListener OnDetectScrollListener;
    公共CustomListView(上下文){
    超级(上下文);
    onCreate(上下文,null,null);
    }
    公共CustomListView(上下文、属性集属性){
    超级(上下文,attrs);
    onCreate(上下文、属性、空);
    }
    公共CustomListView(上下文、属性集属性、int-defStyle){
    超级(上下文、属性、定义样式);
    onCreate(上下文、属性、定义样式);
    }
    private void onCreate(上下文上下文、属性集属性、整数定义样式){
    setListeners();
    }
    私有void setListeners(){
    super.setOnScrollListener(新的OnScrollListener(){
    私家车;
    私有int oldFirstVisibleItem;
    @凌驾
    公共无效onScrollStateChanged(AbsListView视图,int scrollState){
    if(onScrollListener!=null){
    onScrollListener.onScrollStateChanged(视图,滚动状态);
    }
    }
    @凌驾
    public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、int totalItemCount){
    if(onScrollListener!=null){
    onScrollListener.onScroll(视图、firstVisibleItem、visibleItemCount、totalItemCount);
    }
    如果(onDetectScrollListener!=null){
    onDetectedListScroll(视图,firstVisibleItem);
    }
    }
    私有void onDetectedListScroll(AblistView AblistView,int firstVisibleItem){
    视图=absListView.getChildAt(0);
    int top=(view==null)?0:view.getTop();
    如果(firstVisibleItem==oldFirstVisibleItem){
    如果(顶部>顶部){
    onDetectScrollListener.onUpScrolling();
    }否则如果(顶部<旧顶部){
    onDetectScrollListener.onDownScrolling();
    }
    }否则{
    if(firstVisibleItem
    为listIsAtTop()函数尝试以下操作:

    list = (com.app.frisbeee.account_view.CustomListView)findViewById(R.id.accountview_listview);
    adapter = new Account_view_custom_adapter(Account_view_act.this, annoncesList);
                list.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                registerForContextMenu(list);
    
                list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        list.showContextMenuForChild(view);   
                    }
                });
    
                list.setOnDetectScrollListener(new OnDetectScrollListener() {
                    @Override
                    public void onUpScrolling() {
                        /* do something */
                        Log.d("INFO", "UPPPPPPPPPPP");
                        if (listIsAtTop()) {
                            RelativeLayout relative1 = (RelativeLayout) findViewById(R.id.relative1);
                            relative1.setVisibility(View.VISIBLE);
                        }
                    }
    
                    @Override
                    public void onDownScrolling() {
                        /* do something */
                        Log.d("INFO", "DOWNNNNNNNN");
                        if (!listIsAtTop()) {
                            RelativeLayout relative1 = (RelativeLayout) findViewById(R.id.relative1);
                            relative1.setVisibility(View.GONE);
                        }
    
                    }
                });
    
            }
    
    private boolean listIsAtTop()   {   
            if (list.getChildCount() == 0) {
                return true;
            }
            return list.getFirstVisiblePosition() == 0 && (list.getChildCount() == 0 || list.getChildAt(0).getTop() == 0);
        }
    
    private boolean listIsAtTop()   {   
        if(listView.getChildCount() == 0) return true;
        return listView.getChildAt(0).getTop() == 0;
    }
    
    至于滑动动画:

    list = (com.app.frisbeee.account_view.CustomListView)findViewById(R.id.accountview_listview);
    adapter = new Account_view_custom_adapter(Account_view_act.this, annoncesList);
                list.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                registerForContextMenu(list);
    
                list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        list.showContextMenuForChild(view);   
                    }
                });
    
                list.setOnDetectScrollListener(new OnDetectScrollListener() {
                    @Override
                    public void onUpScrolling() {
                        /* do something */
                        Log.d("INFO", "UPPPPPPPPPPP");
                        if (listIsAtTop()) {
                            RelativeLayout relative1 = (RelativeLayout) findViewById(R.id.relative1);
                            relative1.setVisibility(View.VISIBLE);
                        }
                    }
    
                    @Override
                    public void onDownScrolling() {
                        /* do something */
                        Log.d("INFO", "DOWNNNNNNNN");
                        if (!listIsAtTop()) {
                            RelativeLayout relative1 = (RelativeLayout) findViewById(R.id.relative1);
                            relative1.setVisibility(View.GONE);
                        }
    
                    }
                });
    
            }
    
    private boolean listIsAtTop()   {   
            if (list.getChildCount() == 0) {
                return true;
            }
            return list.getFirstVisiblePosition() == 0 && (list.getChildCount() == 0 || list.getChildAt(0).getTop() == 0);
        }
    
    private boolean listIsAtTop()   {   
        if(listView.getChildCount() == 0) return true;
        return listView.getChildAt(0).getTop() == 0;
    }
    
    slide_down.xml的代码:

    <set xmlns:android="http://schemas.android.com/apk/res/android">  
        <translate android:fromXDelta="0" android:fromYDelta="-1000" android:duration="1500"/>
    </set>
    
    然后只需将其连接到您的亲属邮箱:

    relative1.startAnimation(slideUp);
    

    希望这能有所帮助:)

    一旦你做到这一点,请告诉我。我也需要同样的。在过去,我通过更改
    布局权重
    实现了同样的效果,但非常粗糙。谢谢。它不太好用。我必须放这行:
    relative1.startAnimation(slideUp)我试着把它放在setVisibility之前。。你试过你的代码了吗?你把那一行放在任何你想让你的动画执行的地方。是的,我试过这个代码,我一直在使用动画:P动画不工作吗?当你运行它时发生了什么?我用你的代码更新了我的代码,并制作了一段关于这个问题的视频。我希望你能更清楚地理解我为什么会有眨眼的问题。。。这是链接:我明白了。是否仅将动画应用于淡粉色部分?或者你也将其应用于深平和灰色条上?只有相对浅粉色条。其目的是在滚动期间继续以深粉色显示relativeLayout