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);
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)
不变形: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);
}
}