原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/1014/678.html
任何一个控件都是能够转动的,由于在View类中间有scrollTo()和scrollBy()这两个技巧,但应用常州网站开发培训这两个技巧完成的转动结果是跨越式的,没有任何平滑转动的结果.而Scroller恰是完成平滑转动的利器
Android Scroller彻底分析
View滑动的若干技巧
startScroll技巧
对于Scroller的startScroll 技巧一直不太明白
startScroll
added in API level 9
public void startScroll (int startX,
int startY,
int dx,
int dy)
Start scrolling by providing a starting point and the distance to travel. The scroll will use the default value of 250 milliseconds for the duration.
Parameters
startX int: Starting horizontal scroll offset in pixels. Positive numbers will scroll the content to the left.
startY int: Starting vertical scroll offset in pixels. Positive numbers will scroll the content up.
dx int: Horizontal distance to travel. Positive numbers will scroll the content to the left.
dy int: Vertical distance to travel. Positive numbers will scroll the content up.
例子: 点击Button完成平滑转动
public class ScrollerButton extends Button {
private OverScroller mScroller;
public ScrollerButton(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new OverScroller(context);
}
@Override
public void computeScroll() {
super.computeScroll();
if (mScroller.computeScrollOffset()) {
((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}
public void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll(scrollX, 0, delta, 0, 2000);
invalidate();
}
}
----
挪用片面:
scrollToBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
layout.scrollTo(-60, 0);
}
});
smoothScrollToBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
smoothScrollToBtn.smoothScrollTo(-60, 0);
}
});
由于转动都是针对内容,要想完成Button整体挪动, computeScroll中要挪用其父控件的scrollTo技巧
对照常州软件技术培训新鲜是,第一次点击, Butoon两秒后向右挪动到60地位
再次点击,又重复这个动作,先向左回到0,再向右回到 60 -> 0 -> 60
为何会如许呢, 本来是getScrollX()在捣鬼, Button永远没有实行过ScroolTo和ScroolBy技巧, 以是getScrollX永远为0. 以是一直重复 0 到 -60
论startScroll的精确用法
public void smoothScrollTo(int destX, int destY) {
int scrollX = ((View) getParent()).getScrollX();
Log.i(TAG, "smoothScrollTo: " + scrollX);
mScroller.startScroll(scrollX, 0, destX - scrollX, 0, 2000);
invalidate();
}
第一个参数的要写getScrollX(), 避免上头的新鲜现象
第三个参数要减去scrollX, 如许能够包管滑到指定地位就不滑了, 否则回出现永远滑动的问题.
void startScroll(int start, int distance, int duration) {
mFinished = false;
mCurrentPosition = mStart = start;
mFinal = start + distance;
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mDuration = duration;
// Unused
mDeceleration = 0.0f;
mVelocity = 0;
}
上篇:上一篇:Android之 Fragment 的使用
下篇:下一篇:C/C++ 用MySql数据库的技巧