modify some abslistview's animations

This commit is contained in:
houzh 2023-11-18 14:56:28 +08:00
parent 5b95cbba9b
commit 283936d0f9
5 changed files with 44 additions and 34 deletions

View File

@ -50,7 +50,7 @@ int main(int argc,const char*argv[]){
lv->setVerticalScrollBarEnabled(true);
lv->setOverScrollMode(View::OVER_SCROLL_ALWAYS);
lv->setDividerHeight(1);
for(int i=0;i<32;i++){
for(int i=0;i<64;i++){
adapter->add("");
}
lv->addHeaderView(createHeader(),nullptr,false);
@ -59,8 +59,10 @@ int main(int argc,const char*argv[]){
adapter->notifyDataSetChanged();
lv->setSelector(new ColorDrawable(0x8800FF00));
lv->setSelection(2);
lv->setOnItemClickListener([](AdapterView&lv,View&v,int pos,long id){
lv->setOnItemClickListener([adapter](AdapterView&lv,View&v,int pos,long id){
LOGD("clicked %d",pos);
if(pos==60)
((AbsListView&)lv).smoothScrollToPosition(0);
});
lv->requestLayout();
app.exec();

View File

@ -33,11 +33,19 @@
<id name="closekeyboard">0x00000406</id>
<id name="predict1">0x00000407</id>
<id name="keyboardview">0x00000408</id>
<id name="increment">0x00000409</id>
<id name="numberpicker_input">0x0000040a</id>
<id name="decrement">0x0000040b</id>
<id name="body">0x0000040c</id>
<id name="select_dialog_listview">0x0000040d</id>
<id name="text1">0x0000040e</id>
<id name="prev">0x00000409</id>
<id name="rew">0x0000040a</id>
<id name="pause">0x0000040b</id>
<id name="ffwd">0x0000040c</id>
<id name="next">0x0000040d</id>
<id name="time_current">0x0000040e</id>
<id name="mediacontroller_progress">0x0000040f</id>
<id name="time">0x00000410</id>
<id name="increment">0x00000411</id>
<id name="numberpicker_input">0x00000412</id>
<id name="decrement">0x00000413</id>
<id name="body">0x00000414</id>
<id name="select_dialog_listview">0x00000415</id>
<id name="text1">0x00000416</id>
</resources>

View File

@ -2463,7 +2463,6 @@ void View::onDrawScrollBars(Canvas& canvas){
getVerticalScrollBarBounds(&bounds, nullptr);
onDrawVerticalScrollBar(canvas, scrollBar, bounds);
if (bInvalidate) invalidate(bounds);
//LOGD("%p:%d state=%d invalidate=%d rect=(%d,%d,%d,%d)",this,mID,cache->state,bInvalidate,bounds.left,bounds.top,bounds.width,bounds.height);
}
}
}

View File

@ -39,21 +39,23 @@ namespace R{
static constexpr int closekeyboard = 0x00000406 ;/*1030*/
static constexpr int predict1 = 0x00000407 ;/*1031*/
static constexpr int keyboardview = 0x00000408 ;/*1032*/
static constexpr int increment = 0x00000409 ;/*1033*/
static constexpr int numberpicker_input = 0x0000040A ;/*1034*/
static constexpr int decrement = 0x0000040B ;/*1035*/
static constexpr int body = 0x0000040C ;/*1036*/
static constexpr int select_dialog_listview = 0x0000040D ;/*1037*/
static constexpr int text1 = 0x0000040E ;/*1038*/
static constexpr int prev = 0x00000409 ;/*1033*/
static constexpr int rew = 0x0000040A ;/*1034*/
static constexpr int pause = 0x0000040B ;/*1035*/
static constexpr int ffwd = 0x0000040C ;/*1036*/
static constexpr int next = 0x0000040D ;/*1037*/
static constexpr int time_current = 0x0000040E ;/*1038*/
static constexpr int mediacontroller_progress= 0x0000040F ;/*1039*/
static constexpr int time = 0x00000410 ;/*1040*/
static constexpr int increment = 0x00000411 ;/*1041*/
static constexpr int numberpicker_input = 0x00000412 ;/*1042*/
static constexpr int decrement = 0x00000413 ;/*1043*/
static constexpr int body = 0x00000414 ;/*1044*/
static constexpr int select_dialog_listview = 0x00000415 ;/*1045*/
static constexpr int text1 = 0x00000416 ;/*1046*/
};/*namespace id*/
namespace strings{
static constexpr int number_picker_increment_button= 0x000003E8 ;/*1000*/
static constexpr int number_picker_decrement_button= 0x000003E9 ;/*1001*/
static constexpr int row1 = 0x000003EA ;/*1002*/
static constexpr int row2 = 0x000003EB ;/*1003*/
static constexpr int row3 = 0x000003EC ;/*1004*/
static constexpr int row4 = 0x000003ED ;/*1005*/
};/*namespace strings*/
};//endof namespace R

View File

@ -3530,7 +3530,7 @@ void AbsListView::PositionScroller::doScroll() {
if (lastPos == mLastSeenPos) {
// No new views, let things keep going.
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mPostScrollRunner);
return;
}
@ -3563,7 +3563,7 @@ void AbsListView::PositionScroller::doScroll() {
if (nextPos == mLastSeenPos) {
// No new views, let things keep going.
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mPostScrollRunner);
return;
}
@ -3577,7 +3577,7 @@ void AbsListView::PositionScroller::doScroll() {
mLastSeenPos = nextPos;
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mPostScrollRunner);
} else {
if (nextViewTop > extraScroll) {
mLV->smoothScrollBy(nextViewTop - extraScroll, mScrollDuration, true, false);
@ -3697,8 +3697,7 @@ void AbsListView::PositionScroller::doScroll() {
// On-screen, just scroll.
const int targetTop = mLV->getChildAt(position - firstPos)->getTop();
const int distance = targetTop - mOffsetFromTop;
const int duration = (int) (mScrollDuration *
((float) std::abs(distance) / mLV->getHeight()));
const int duration = (int) (mScrollDuration * ((float) std::abs(distance) / mLV->getHeight()));
mLV->smoothScrollBy(distance, duration, true, false);
}
break;
@ -3896,7 +3895,7 @@ void AbsListView::FlingRunnable::start(int initialVelocity) {
mLV->mTouchMode = TOUCH_MODE_FLING;
mSuppressIdleStateChangeCall = false;
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
if (PROFILE_FLINGING) {
if (!mLV->mFlingProfilingStarted) {
mLV->mFlingProfilingStarted = true;
@ -3912,7 +3911,7 @@ void AbsListView::FlingRunnable::startSpringback() {
if (mScroller->springBack(0, mLV->mScrollY, 0, 0, 0, 0)) {
mLV->mTouchMode = TOUCH_MODE_OVERFLING;
mLV->invalidate();
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
} else {
mLV->mTouchMode = TOUCH_MODE_REST;
mLV->reportScrollStateChange(OnScrollListener::SCROLL_STATE_IDLE);
@ -3925,7 +3924,7 @@ void AbsListView::FlingRunnable::startOverfling(int initialVelocity) {
mLV->mTouchMode = TOUCH_MODE_OVERFLING;
mSuppressIdleStateChangeCall = false;
mLV->invalidate();
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
}
void AbsListView::FlingRunnable::edgeReached(int delta) {
@ -3942,7 +3941,7 @@ void AbsListView::FlingRunnable::edgeReached(int delta) {
mLV->mPositionScroller->stop();
}
mLV->invalidate();
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
}
void AbsListView::FlingRunnable::startScroll(int distance, int duration, bool linear, bool suppressEndFlingStateChangeCall) {
@ -3952,13 +3951,13 @@ void AbsListView::FlingRunnable::startScroll(int distance, int duration, bool li
mScroller->startScroll(0, initialY, 0, distance, duration);
mLV->mTouchMode = TOUCH_MODE_FLING;
mSuppressIdleStateChangeCall = suppressEndFlingStateChangeCall;
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
}
void AbsListView::FlingRunnable::endFling() {
mLV->mTouchMode = TOUCH_MODE_REST;
mLV->removeCallbacks(*this);
mLV->removeCallbacks(mLV->mFlingRunnable);
mLV->removeCallbacks(mCheckFlywheel);
if (!mSuppressIdleStateChangeCall)
@ -4038,7 +4037,7 @@ void AbsListView::FlingRunnable::run() {
if (more && !atEnd) {
if (atEdge) mLV->invalidate();
mLastFlingY = y;
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
} else {
endFling();
if (PROFILE_FLINGING) {
@ -4072,7 +4071,7 @@ void AbsListView::FlingRunnable::run() {
}
} else {
mLV->invalidate();
mLV->postOnAnimation(*this);
mLV->postOnAnimation(mLV->mFlingRunnable);
}
} else {
endFling();