自己的View工具类---ViewUtil

来源:互联网 发布:handler源码解析 编辑:程序博客网 时间:2024/05/19 17:57
package com.app.util;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ExpandableListAdapter;import android.widget.ExpandableListView;import android.widget.ListAdapter;import android.widget.ListView;/** * 解决view高度之类的问题 * @author Wonghoman */public class ViewUtil {private final String TAG = "ViewUtil";/**  * 动态改变listView的高度  * 计算ExpandableListView的group项的高度的方法(即计算listview合并时的高度的方法) * 备注:ExpandableListView是listview的子类所以,listview的方法它同样可以使用 *  * maxHeight:最大高度,不作限制的话用“非正数”表示 */public static void setListViewHeightBasedOnChildren(ListView listView, int maxHeight) {          // 获取ListView对应的Adapter          ListAdapter listAdapter = listView.getAdapter();          if(listAdapter == null) {              return;          }          int totalHeight = 0;          for(int i = 0, len = listAdapter.getCount(); i < len; i++) {            View listItem = listAdapter.getView(i, null, listView);            if(listItem == null)            return;            listItem.measure(0, 0); // 计算子项View 的宽高              totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度          }          ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight                  + (listView.getDividerHeight() * (listAdapter.getCount() - 1));        // listView.getDividerHeight()获取子项间分隔符占用的高度          if(maxHeight > 0){        params.height = params.height > maxHeight ? maxHeight : params.height;        }        listView.setLayoutParams(params);    }/**     * 可扩展listview展开时调用     * 计算ExpandableListView展开时group下的子view列表的高度的方法     * @param listView     * @param groupPosition     */    public static void setExpandedListViewHeightBasedOnChildren(            ExpandableListView listView, int groupPosition) {        ExpandableListAdapter listAdapter = listView.getExpandableListAdapter();        if (listAdapter == null) {            return;        }        View listItem = listAdapter.getChildView(groupPosition, 0, true, null,                listView);        listItem.measure(0, 0);        int appendHeight = 0;        for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) {            appendHeight += listItem.getMeasuredHeight();        }        ViewGroup.LayoutParams params = listView.getLayoutParams();//        Log.d(TAG, "Expand params.height" + params.height);        params.height += appendHeight;        listView.setLayoutParams(params);    }        /**     * 可扩展listview收起时调用     * 计算ExpandableListView合并时消除group下的子view列表的高度的方法     * @param listView     * @param groupPosition     */    public static void setCollapseListViewHeightBasedOnChildren(            ExpandableListView listView, int groupPosition) {        ExpandableListAdapter listAdapter = listView.getExpandableListAdapter();        if (listAdapter == null) {            return;        }        View listItem = listAdapter.getChildView(groupPosition, 0, true, null,                listView);        listItem.measure(0, 0);        int appendHeight = 0;        for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) {            appendHeight += listItem.getMeasuredHeight();        }        /*Log.d(TAG,                "Collapse childCount="                        + listAdapter.getChildrenCount(groupPosition));*/        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height -= appendHeight;        listView.setLayoutParams(params);    }        /**     *  判断点击屏幕的位置是不是在指定的view上     * @param view      * @param ev     * @return     */    public static boolean inRangeOfView(View view, MotionEvent ev) {int[] location = new int[2];view.getLocationOnScreen(location);int x = location[0];int y = location[1];if (ev.getX() < x || ev.getX() > (x + view.getWidth()) || ev.getY() < y|| ev.getY() > (y + view.getHeight())) {return false;}return true;}}

0 0
原创粉丝点击