杂货铺(便捷过渡动画,模拟人手触摸控件,layout_margin失效等等)

来源:互联网 发布:求二叉树的深度java 编辑:程序博客网 时间:2024/05/07 18:21

最近忙了一整子,在其中也学到了很多好用的开发中会用到的小知识,在这里总结一下分享给大家,也为自己做做笔记。


1.android:animateLayoutChanges="true",便捷动画过渡。

对于ViewGroups对象布局变化的动画,属性动画系统给ViewGroup对象的动画变化提供了与View对象一样容易动画处理方法。
使用LayoutTransition类在ViewGroup内部处理布局变化的动画。当调用一个View对象的setVisibility()方法,或者设置该View的GONE常量,或者把该View对象添加到ViewGroup中(或者从ViewGroup中删除)时,在ViewGroup内部的View对象就能够实现时隐时现的动画效果。当在ViewGroup对象中添加或删除View对象时,其中的其他View对象也能够动画移动到新的位置。在LayoutTransition对象内通过调用setAnimator()方法,并且在传递给该方法的Animator对象参数中带有下列LayoutTransition常量之一,就能够定义该常量所代表的动画:

1.  APPEARING---一个标记,它指示要在容器中正在显示的项目上运行动画;

2.  CHANGE APPEARING---一个标记,它指示在容器中由于新项目的出现而导致其他项目变化所要运行的动画;

3.  DISAPPEARING---一个标记,它指示一个从容器中消失的项目所要运行的动画;

4.  CHANGE_DISAPPEARING---一个标记,它指示由于一个项目要从容器中消失而导致其他项目的变化,所要运行的动画。

能够给这四种事件类型定义自定义动画,以便定制自己的布局过渡效果,也可以告诉动画系统只使用默认的动画效果。

在APIDemo中的LayoutAnimations示例,显示了如何给布局的过渡定义动画效果,并且在想要动画效果的View对象上设置动画。

LayoutAnimationsByDefault类以及它对应的layout_animations_by_default.xml布局资源文件显示了如何在XML中启用ViewGroup对象的默认布局过渡效果。需要做的事情仅仅是把ViewGroup元素的android.animateLayoutchanges属性设置为true。例如:

<LinearLayout

   android:orientation="vertical"

   android:layout_width="wrap_content"

   android:layout_height="match_parent"

   android:id="@+id/verticalContainer"

android:animateLayoutChanges="true" />

如果把这个属性设置为true,那么在该ViewGroup对象中添加或删除View对象,以及ViewGroup对象中其他的View对象都会自动的具有动画效果。


2.performClick 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件)

先看看performClick()源码:
public boolean performClick() {
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
 
        if (mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            mOnClickListener.onClick(this);
            return true;
        }
 
        return false;
    }

由源码可以看出,只要是使用了view.setOnClickListener()方法设置监听器,就会自动触发view.performClick()。
需要注意的是,如果同时使用了view.setOnTouchListener()方法,则有可能存在拦截view.performClick()的响应事件,因为当view.OnTouchEvent()在event.getAction() == MotionEvent.ACTION_DOWN时返回false,系统会认为view不需要处理Touch事件,则后续的Touch事件(move、up、click)就不会被传进来,所以也不会触发view.performClick(),而view.setOnTouchListener()相当于是重写了view.OnTouchEvent(),所以在写view的TouchListener处理时,需要留意view是否存在点击事件监听,如果有,则在适当的位置使用view.performClick()触发点击事件。


3.layout_margin失效

<LinearLayout  
    android:id="@+id/main"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:layout_margin="20dp"  
    android:orientation="vertical">  
上面这种做法在某些Android版本放到scrollview或者RelativeLayou里面的话,layout_margin会失效,不起作用!比如三星某些机型
在属性里面加入android:layout_gravity="top",问题就解决了,原因我还不知道。


4.EditText监听软键盘,举例:让回车变为搜索,防止重复搜索

直接上代码啦

 <EditText
            android:id="@+id/edit_note"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:hint="请输入您想搜索的内容"
            android:background="@null"
            android:imeOptions="actionSearch"//将回车按钮显示搜索
            android:singleLine="true"//不可以省略,否则回车依旧是回车
            android:textSize="13dp"
            android:textColor="#464646" />

 editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEARCH){//actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH,防止重复搜索
                    ((InputMethodManager) editText.getContext().getSystemService(INPUT_METHOD_SERVICE))
                            .hideSoftInputFromWindow(AddContactActivity.this
                                            .getCurrentFocus()
                                            .getWindowToken(),
                                    InputMethodManager.HIDE_NOT_ALWAYS);//软键盘关闭


                    if (TextUtils.isEmpty(editText.getText().toString())) 
Toast.makeText(BaseApplinaction.context(), "搜索内容不能为空", Toast.LENGTH_SHORT).show();
                    else
                        add_search_btn.performClick();
                    return true;
                }
                return false;
            }
        });


5.精确记录和恢复ListView滑动位置

此需求就是用户进行了操作实时刷新操作数据,我之前的做法是先请求接口,后台说成功了然后回调操作的item,对其进行改变。同事推荐的方式如下,感觉也很好用,大家可以根据需要进行使用。

方法1(推荐):
listView.setOnScrollListener(scrollListener);
private OnScrollListener scrollListener = new OnScrollListener() {
 
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                        // SCROLL_STATE_IDLE表示处于静止状态
                        if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                               // scrollPos记录当前可见的顶端条目位置 
                               scrollPos = view.getFirstVisiblePosition(); 
                        }
                        if (arrayList != null) {
                               // 获取首个可见条目(ListView容器中第一个子元素)的top(可能为正也可能为负)
                               View v = view.getChildAt(0);
                               scrollTop = (v == null) ? 0 : v.getTop();
                        }  
                }
        };
// 在setAdapter或者更新适配器数据时执行
listView.setSelectionFromTop(scrollPos, scrollTop);  

方法2:
在onScrollStateChanged里面 
scrolledX = listView.getScrollX(); 
 scrolledY = listView.getScrollY(); 
恢复时使用listView.scrollTo(scrolledX, scrolledY); 

0 0
原创粉丝点击