package me.weyye.todaynews.ui.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.OverScroller;
import android.widget.TextView;
import com.orhanobut.logger.Logger;
/**
* Created by Administrator on 2016/11/21 0021.
*/
public class MyScrollView extends LinearLayout {
private float mLastY;
private LinearLayout mRootView;
private OverScroller mScroller;
private int mHeight;
public MyScrollView(Context context) {
this(context, null);
}
public MyScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mRootView = new LinearLayout(context);
setOrientation(VERTICAL);
mScroller = new OverScroller(context);
mRootView.setOrientation(VERTICAL);
for (int i = 0; i < 50; i++) {
TextView view = new TextView(context);
view.setText("你好" + i);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
mRootView.addView(view);
}
addView(mRootView);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// mHeight =getMeasuredHeight();
// int rootViewHeight =mRootView.getMeasuredHeight();
int w = MeasureSpec.makeMeasureSpec(mRootView.getMeasuredHeight(),
View.MeasureSpec.EXACTLY);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
// //重新测量
mRootView.measure(w, h);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!mScroller.isFinished())
mScroller.abortAnimation();
mLastY = y;
return true;
case MotionEvent.ACTION_MOVE:
float dy = mLastY- mLastY;
Logger.i("-dy:" + dy);
// mRootView.scrollBy(0, (int) -dy);
// scrollBy(0, (int) -dy);
// smoothScrollBy(0, (int) -dy);
// Calling overScrollBy will call onOverScrolled, which
// calls onScrollChanged if applicable.
mLastY = y;
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
// @Override
// protected void measureChild(View child, int parentWidthMeasureSpec,
// int parentHeightMeasureSpec) {
// ViewGroup.LayoutParams lp = child.getLayoutParams();
//
// int childWidthMeasureSpec;
// int childHeightMeasureSpec;
//
// childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft()
// + getPaddingRight(), lp.width);
//
// childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
// MeasureSpec.getSize(parentHeightMeasureSpec), MeasureSpec.UNSPECIFIED);
//
// child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
// }
//调用此方法滚动到目标位置
public void smoothScrollTo(int fx, int fy) {
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
smoothScrollBy(dx, dy);
}
//调用此方法设置滚动的相对偏移
public void smoothScrollBy(int dx, int dy) {
//设置mScroller的滚动偏移量
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
}
// @Override
// public void computeScroll() {
// //先判断mScroller滚动是否完成
// if (mScroller.computeScrollOffset()) {
//
// //这里调用View的scrollTo()完成实际的滚动
// mRootView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
// //必须调用该方法,否则不一定能看到滚动效果
// postInvalidate();
// }
// super.computeScroll();
// }
}