ScrollView相关资料

博客内容涉及ScrollView滚到底部的Java和XML实现,详细解析了GridView的各种特殊属性,如自动列数、列宽、间距等。还讨论了ScrollView与ListView、ExpandableListView的显示冲突解决方案,包括设置固定高度、动态计算高度和重写onMeasure方法。另外提到了ScrollView与ViewPager嵌套的滑动冲突处理,给出了自定义Viewpager和重写ScrollView滑动事件的方法。
摘要由CSDN通过智能技术生成

ScrollView滚到底部方案:

java代码:

svDragLayout.post(new Runnable() {
    public void run() {
        svDragLayout.fullScroll(ScrollView.FOCUS_DOWN);
    }
});

xml布局:

<ScrollView
    android:id="@+id/sv_drag_layout"
    android:layout_width="150dp"
    android:layout_height="250dp"
    android:background="@color/gray_color">

    <LinearLayout
        android:layout_width="150dp"
        android:layout_height="250dp"
        android:orientation="vertical">

        <!--tv高度需要wrap_content或match_parent,总是不要设置固定值,会导致sv无法滚到底部-->
        <TextView
            android:id="@+id/tv_draggable_view"
            android:layout_width="wrap_content"
            android:layout_height="250dp"
            android:background="@color/gray_color"
            android:clickable="true"
            android:padding="2dp"
            android:text=""
            android:textColor="@color/black_color"
            android:textSize="@dimen/main_size" />
    </LinearLayout>
</ScrollView>

控制scrollview是否可以滚动:

this.sv_layout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //true不能滚动,false可以滚动
        return !canScroll;
    }
});

注意:使用滚动容器,除非预先设定了高度,否则所有的w、m属性都是w属性,想要定制自己高度需要自己设置

//设置右边侧滑菜单高度(使用滚动容器,除非预先设定了高度,否则所有的w、m属性都是w属性,想要定制自己高度需要自己设置)
holder.ll_slide_layout.getLayoutParams().height = ScreenUtil.getWidgetHeight(holder.layout_content);
1. HorizontalScrollView里面直接可以放LinearLayout等这些布局类的容器,也可以放一个ImageView这样的控件,但不可以放GridView这样的容器,需要在外面包裹一层LinearLayout布局,不然报错并GridView内容无法显示。。。
(HorizontalScrollView嵌套GridView时,需要在GridView外包裹一层LinearLayout)
2. 列数和列宽都要有,列宽可以用来计算GridView的总宽度,由于HorizontalScrollView嵌套了GridView,所以GridView的宽度必须要计算赋值。。。
int columnWidth = DensityUtil.dip2px(90);//列宽

LayoutParams params = new LayoutParams(mPHCheShowAdapter.getCount()*(columnWidth+DensityUtil.dip2px(10)) - DensityUtil.dip2px(10), LayoutParams.WRAP_CONTENT);
gv_che_show.setLayoutParams(params);
gv_che_show.setColumnWidth(columnWidth);
gv_che_show.setStretchMode(GridView.NO_STRETCH);
gv_che_show.setNumColumns(mPHCheShowAdapter.getCount());
            <HorizontalScrollView 
                android:id="@+id/hs_che_show"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scrollbars="none">
                <LinearLayout
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:gravity="center_vertical"
		            android:padding="@dimen/dp12"
		            android:orientation="horizontal" >
	                <GridView 
	                    android:id="@+id/gv_che_show"
	                    android:layout_width="wrap_content"
	                    android:layout_height="wrap_content"
	                    android:listSelector="@null"
	                    android:horizontalSpacing="@dimen/dp10"
	                    android:scrollbars="none"/>
                   </LinearLayout>
            </HorizontalScrollView>

跳转时调整图片居中:

	@Override
	public void onItemClick(AdapterView<?> parent, View view,
			int position, long id) {
		/**
		 * 计算原理:(滚动布局要滑动的长度)
		 * 相对点击项的左边长度 + 项宽一半 - 屏宽一半
		 */
		int x = (int) (view.getLeft() + view.getWidth()/2.0 - ScreenUtil.getScreenWidth(context)/2.0);
		hs_che_show.smoothScrollTo(x, 0);
		
		Intent intent = new Intent();
		intent.setClass(context, MBigCarActivity.class);
		intent.putExtra(Constant.CHEURLLIST, FastJsonUtil.list2Json(urlList));
		startActivity(intent);
	}

GridView的一些特殊属性:

 

 

1.android:numColumns=”auto_fit”   //GridView的列数设置为自动

2.android:columnWidth=”90dp "       //每列的宽度,也就是Item的宽度

3.android:stretchMode=”columnWidth"//缩放与列宽大小同步

4.android:verticalSpacing=”10dp”          //两行之间的边距

5.android:horizontalSpacing=”10dp”      //两列之间的边距 

6.android:cacheColorHint="#00000000" //去除拖动时默认的黑色背景

7.android:listSelector="#00000000"        //去除选中时的黄色底色

8.android:scrollbars="none"                   //隐藏GridView的滚动条

9.android:fadeScrollbars="true"             //设置为true就可以实现滚动条的自动隐藏和显示

10.android:fastScrollEnabled="true" //GridView出现快速滚动的按钮(至少滚动4页才会显示)

11.android:fadingEdge="none"                //GridView衰落(褪去)边缘颜色为空,缺省值是vertical。(可以理解为上下边缘的提示色)

12.android:fadingEdgeLength="10dip"   //定义的衰落(褪去)边缘的长度

13.android:stackFromBottom="true"       //设置为true时,你做好的列表就会显示你列表的最下面

14.android:transcriptMode="alwaysScroll"//当你动态添加数据时,列表将自动往下滚动最新的条目可以自动滚动到可视范围内

15.android:drawSelectorOnTop="false"  //点击某条记录不放,颜色会在记录的后面成为背景色,内容的文字可见(缺省为false)

注意:
对于GridView和RecyclerView,作为网格控件使用时,列宽是平分的
 
关于ImageView设置图片的几种方法:
不变形:

imageView.setImageResource(int resId);

imageView.setImageBitmap(Bitmap bm);

imageView.setImageDrawable(Drawable drawable);

变形: 

image2.setBackground(getResources().getDrawable(R.drawable.blackk));//变形

image2.setBackgroundResource(R.drawable.blackk);//变形

image2.setBackgroundDrawable(getResources().getDrawable(R.drawable.blackk));变形

 
 

核心说一下 ScrollView 和 ListView 或ExpandableListView显示冲突问题:

方案一:给ListView 设置固定高度。

方案二:计算 动态计算 Adpater 的item 数 * item 高度。

方案三:重写 onMeasure 方法,如下:

public class MyExpandableListView extends ExpandableListView {

	public MyExpandableListView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
		MeasureSpec.AT_MOST);
		super.onMeasure(widthMeasureSpec, expandSpec);
	}
}

ScrollView和ViewPager嵌套使用(导致左右、上下滑动冲突解决方案)

解决方案1:

自定义Viewpager做为子控件

[java] view plain copy print?在CODE上查看代码片派生到我的代码片
public class ChildViewPager extends ViewPager{  
    /** 触摸时按下的点 **/  
    PointF downP = new PointF();  
    /** 触摸时当前的点 **/  
    PointF curP = new PointF();   
    OnSingleTouchListener onSingleTouchListener;  
  
    public ChildViewPager(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        // TODO Auto-generated constructor stub  
    }  
  
    public ChildViewPager(Context context) {  
        super(context);  
        // TODO Auto-generated constructor stub  
    }  
  
    @Override  
    public boolean onInterceptTouchEvent(MotionEvent arg0) {  
        // TODO Auto-generated method stub  
        //当拦截触摸事件到达此位置的时候,返回true,  
        //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent  
        return true;  
    }  
  
    @Override  
    public boolean onTouchEvent(MotionEvent arg0) {  
        // TODO Auto-generated method stub  
        //每次进行onTouch事件都记录当前的按下的坐标  
        curP.x = arg0.getX();  
        curP.y = arg0.getY();  
  
        if(arg0.getAction() == MotionEvent.ACTION_DOWN){  
            //记录按下时候的坐标  
            //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变  
            downP.x = arg0.getX();  
            downP.y = arg0.getY();  
            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰  
            getParent().requestDisallowInterceptTouchEvent(true);  
        }  
  
        if(arg0.getAction() == MotionEvent.ACTION_MOVE){  
            //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰  
            getParent().requestDisallowInterceptTouchEvent(true);  
        }  
  
        if(arg0.getAction() == MotionEvent.ACTION_UP){  
            //在up时判断是否按下和松手的坐标为一个点  
            //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick  
            if(downP.x==curP.x && downP.y==curP.y){  
                onSingleTouch();  
                return true;  
            }  
        }  
  
        return super.onTouchEvent(arg0);  
    }  
  
        /** 
     * 单击 
     */  
    public void onSingleTouch() {  
        if (onSingleTouchListener!= null) {  
  
            onSingleTouchListener.onSingleTouch();  
        }  
    }  
  
    /** 
     * 创建点击事件接口 
     * @author wanpg 
     * 
     */  
    public interface OnSingleTouchListener {  
        public void onSingleTouch();  
    }  
  
    public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {  
        this.onSingleTouchListener = onSingleTouchListener;  
    }  
  
}  

解决方案2:

重写ScrollView的onInterceptTouchEvent()回调函数。需要在程序里新加一个ScrollViewExtend类并继承自ScrollView,下面是其代码:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片
package com.image.indicator.control;  
  
import android.content.Context;  
import android.util.AttributeSet;  
import android.view.MotionEvent;  
import android.widget.ScrollView;  
  
/** 
 * 能够兼容ViewPager的ScrollView 
 * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题 
 
 * @File: ScrollViewExtend.java 
 
 * @Package com.image.indicator.control 
 
 * @Author Hanyonglu 
 
 * @Date 2012-6-18 下午01:34:50 
 
 * @Version V1.0 
 */  
public class ScrollViewExtend extends ScrollView {  
    // 滑动距离及坐标  
    private float xDistance, yDistance, xLast, yLast;  
  
    public ScrollViewExtend(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @Override  
    public boolean onInterceptTouchEvent(MotionEvent ev) {  
        switch (ev.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
                xDistance = yDistance = 0f;  
                xLast = ev.getX();  
                yLast = ev.getY();  
                break;  
            case MotionEvent.ACTION_MOVE:  
                final float curX = ev.getX();  
                final float curY = ev.getY();  
  
                xDistance += Math.abs(curX - xLast);  
                yDistance += Math.abs(curY - yLast);  
                xLast = curX;  
                yLast = curY;  
  
                if(xDistance > yDistance){  
                    return false;  
                }    
        }  
  
        return super.onInterceptTouchEvent(ev);  
    }  
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值