導航:首頁 > 操作系統 > androidscrollto動畫

androidscrollto動畫

發布時間:2022-06-01 00:57:56

android的這種動畫效果的listview是怎麼做出來的

可以試試listview的smoothScrollByOffset和smoothScrollToPosition,我試了一下,不是直接跳過去,而是滾過去,你可以試試看能不能符合你的要求。

㈡ android 為什麼初始界面scrollView.scrollTo執行無效

翻閱查找ScrollView的文檔並搜索了一下沒有發現直接設置的屬性和方法,這里通過繼承來達到這一目的。 /** * 快/慢滑動ScrollView * @author 農民伯伯 * */ public class SlowScrollView extends ScrollView { public SlowScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public SlowScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public SlowScrollView(Context context) { super(context); } /** * 滑動事件 */ @Override public void fling(int velocityY) { super.fling(velocityY / 4); } } 代碼說明: 重點在"velocityY / 4",這里意思是滑動速度減慢到原來四分之一的速度,這里大家可以根據自己的需求加快或減慢滑動速度。 查看原帖>>

㈢ android中ScrollView的smoothScrollTo為什麼會不執行呢

系統故障?

㈣ scrollView的scrollTo如何設置動畫時間

翻閱查找ScrollView的文檔並搜索了一下沒有發現直接設置的屬性和方法,這里通過繼承來達

㈤ Android scrollBy和scrollTo的區別

scrollTo(int x,int y): 如果偏移位置發生了改變,就會給mScrollX和mScrollY賦新值,改變當前位置。 注意:x,y代表的不是坐標點,而是偏移量。 scrollBy(int x,int y): 它實際上是調用了scrollTo(mScrollX + x, mScrollY + y); mScrollX + x和mScrollY + y,即表示在原先偏移的基礎上在發生偏移,通俗的說就是相對當前位置偏移。 blog#csdn#net/vipzjyno1/article/details/24577023

㈥ scrollto和scrollby的區別

1、區別
1)scrollTo()是一步到位;
2)scrollBy()是逐步累加。

2、例子:
1)假設有一個View,如果想把SView從(0, 0)移動到(100, 100)。注意,這里說的(0, 0)和(100, 100),指的是SView左上角的坐標。那麼偏移量就是原點(0, 0)到目標點(100, 100)的距離,即(0 , 0) - (100, 100) = (-100, -100)。
只需要調用SView.scrollTo(-100, -100)就可以了。scrollTo(int x, int y)的兩個參數x和y,代表的是偏移量,這時的參照物是(0, 0)點。

然而,scrollBy()是有一定的區別的。scrollBy()的參照物是(0, 0)點加上偏移量之後的坐標。
2)假設SView調用了scrollTo(-100, -100),此時SView左上角的坐標是(100, 100),這時再調用scrollBy(-20, -20),此時SView的左上角就被繪制到了(120, 120)這個位置。

㈦ android 如何實現邊緣拖動側滑

據需求需要自己自定義一個ListView來實現該功能,接下來先貼出代碼再講解具體的實現

package com.example.slidecutlistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Scroller;

/**
* @blog http://blog.csdn.net/xiaanming
*
* @author xiaanming
*
*/
public class SlideCutListView extends ListView {
/**
* 當前滑動的ListViewposition
*/
private int slidePosition;
/**
* 手指按下X的坐標
*/
private int downY;
/**
* 手指按下Y的坐標
*/
private int downX;
/**
* 屏幕寬度
*/
private int screenWidth;
/**
* ListView的item
*/
private View itemView;
/**
* 滑動類
*/
private Scroller scroller;
private static final int SNAP_VELOCITY = 600;
/**
* 速度追蹤對象
*/
private VelocityTracker velocityTracker;
/**
* 是否響應滑動,默認為不響應
*/
private boolean isSlide = false;
/**
* 認為是用戶滑動的最小距離
*/
private int mTouchSlop;
/**
* 移除item後的回調介面
*/
private RemoveListener mRemoveListener;
/**
* 用來指示item滑出屏幕的方向,向左或者向右,用一個枚舉值來標記
*/
private RemoveDirection removeDirection;

// 滑動刪除方向的枚舉值
public enum RemoveDirection {
RIGHT, LEFT;
}

public SlideCutListView(Context context) {
this(context, null);
}

public SlideCutListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public SlideCutListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
scroller = new Scroller(context);
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}

/**
* 設置滑動刪除的回調介面
* @param removeListener
*/
public void setRemoveListener(RemoveListener removeListener) {
this.mRemoveListener = removeListener;
}

/**
* 分發事件,主要做的是判斷點擊的是那個item, 以及通過postDelayed來設置響應左右滑動事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
addVelocityTracker(event);

// 假如scroller滾動還沒有結束,我們直接返回
if (!scroller.isFinished()) {
return super.dispatchTouchEvent(event);
}
downX = (int) event.getX();
downY = (int) event.getY();

slidePosition = pointToPosition(downX, downY);

// 無效的position, 不做任何處理
if (slidePosition == AdapterView.INVALID_POSITION) {
return super.dispatchTouchEvent(event);
}

// 獲取我們點擊的item view
itemView = getChildAt(slidePosition - getFirstVisiblePosition());
break;
}
case MotionEvent.ACTION_MOVE: {
if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
|| (Math.abs(event.getX() - downX) > mTouchSlop && Math
.abs(event.getY() - downY) < mTouchSlop)) {
isSlide = true;
}
break;
}
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
break;
}

return super.dispatchTouchEvent(event);
}

/**
* 往右滑動,getScrollX()返回的是左邊緣的距離,就是以View左邊緣為原點到開始滑動的距離,所以向右邊滑動為負值
*/
private void scrollRight() {
removeDirection = RemoveDirection.RIGHT;
final int delta = (screenWidth + itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, -delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}

/**
* 向左滑動,根據上面我們知道向左滑動為正值
*/
private void scrollLeft() {
removeDirection = RemoveDirection.LEFT;
final int delta = (screenWidth - itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}

/**
* 根據手指滾動itemView的距離來判斷是滾動到開始位置還是向左或者向右滾動
*/
private void scrollByDistanceX() {
// 如果向左滾動的距離大於屏幕的三分之一,就讓其刪除
if (itemView.getScrollX() >= screenWidth / 3) {
scrollLeft();
} else if (itemView.getScrollX() <= -screenWidth / 3) {
scrollRight();
} else {
// 滾回到原始位置,為了偷下懶這里是直接調用scrollTo滾動
itemView.scrollTo(0, 0);
}

}

/**
* 處理我們拖動ListView item的邏輯
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
addVelocityTracker(ev);
final int action = ev.getAction();
int x = (int) ev.getX();
switch (action) {
case MotionEvent.ACTION_MOVE:
int deltaX = downX - x;
downX = x;

// 手指拖動itemView滾動, deltaX大於0向左滾動,小於0向右滾
itemView.scrollBy(deltaX, 0);
break;
case MotionEvent.ACTION_UP:
int velocityX = getScrollVelocity();
if (velocityX > SNAP_VELOCITY) {
scrollRight();
} else if (velocityX < -SNAP_VELOCITY) {
scrollLeft();
} else {
scrollByDistanceX();
}

recycleVelocityTracker();
// 手指離開的時候就不響應左右滾動
isSlide = false;
break;
}

return true; // 拖動的時候ListView不滾動
}

//否則直接交給ListView來處理onTouchEvent事件
return super.onTouchEvent(ev);
}

@Override
public void computeScroll() {
// 調用startScroll的時候scroller.computeScrollOffset()返回true,
if (scroller.computeScrollOffset()) {
// 讓ListView item根據當前的滾動偏移量進行滾動
itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY());

postInvalidate();

// 滾動動畫結束的時候調用回調介面
if (scroller.isFinished()) {
if (mRemoveListener == null) {
throw new NullPointerException(RemoveListener is null, we should called setRemoveListener());
}

itemView.scrollTo(0, 0);
mRemoveListener.removeItem(removeDirection, slidePosition);
}
}
}

/**
* 添加用戶的速度跟蹤器
*
* @param event
*/
private void addVelocityTracker(MotionEvent event) {
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}

velocityTracker.addMovement(event);
}

/**
* 移除用戶速度跟蹤器
*/
private void recycleVelocityTracker() {
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
}

/**
* 獲取X方向的滑動速度,大於0向右滑動,反之向左
*
* @return
*/
private int getScrollVelocity() {
velocityTracker.computeCurrentVelocity(1000);
int velocity = (int) velocityTracker.getXVelocity();
return velocity;
}

/**
*
* 當ListView item滑出屏幕,回調這個介面
* 我們需要在回調方法removeItem()中移除該Item,然後刷新ListView
*
* @author xiaanming
*
*/
public interface RemoveListener {
public void removeItem(RemoveDirection direction, int position);
}

}

㈧ android recyclerview 是否能上滑動

使用RecyclerView時,調用smoothScrollToPostion()方法滑動到指定位置,但是條目很多時滑動的很慢,本篇文章就是實現RecyclerView的快速滑動。
先介紹如何實現,然後再介紹原理。
實現代碼創建FastScrollLinearLayoutManager,繼承LinearLayoutManager復moothScrollToPosition()方法,主要復寫LinearSmoothScroller中方法
代碼如下,解釋全在注釋中:
public class FastScrollLinearLayoutManager extends LinearLayoutManager {
public FastScrollLinearLayoutManager(Context context) { super(context);
} @Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { @Override
public PointF (int targetPosition) { return FastScrollLinearLayoutManager.this.(targetPosition);
} //該方法控制速度。
//if returned value is 2 ms, it means scrolling 1000 pixels with LinearInterpolation should take 2 seconds.
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { /*
mdpi上, 1英寸有160個像素點, 25/160,
xxhdpi,1英寸有480個像素點, 25/480,
*/
//return 10F / displayMetrics.densityDpi;//可以減少時間,默認25F
return super.calculateSpeedPerPixel(displayMetrics);
//Calculates the time it should take to scroll the given distance (in pixels)
protected int calculateTimeForScrolling(int dx) { /*
控制距離, 然後根據上面那個方(calculateSpeedPerPixel())提供的速度算出時間,默認一次 滾動 TARGET_SEEK_SCROLL_DISTANCE_PX = 10000個像素, 在此處可以減少該值來達到減少滾動時間的目的.
*/
//間接計算時提高速度,也可以直接在calculateSpeedPerPixel提高
if (dx > 3000) {
dx = 3000;
} int time = super.calculateTimeForScrolling(dx);
LogUtil.d(time);//列印時間看下
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
從復寫的兩個方法可以看出,都是為了提高滑動速度。一種是直接修改速度,另外一種是通過減少距離來減少所需時間,間接提高滑動速度。
這兩種方法都可以,看自己所需。接下來就講講實現的原理。這塊我只是梳理的大致的流程,不過至此你已經可以實現快速滑動了。
2. RecyclerView 滑動過程梳理
1.調用RecyclerView.smoothScrollToPosition(position)時public void moothScrollToPosition(int position) { //...直接調用了LayoutManage的該方法
}1234
2.LinearLayoutManager中@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) { //...
}; //設置終點位置
linearSmoothScroller.setTargetPosition(position); //開始滾動,使用LinearSmoothScroller(一直勻速滑動,當targetPosition出現在屏幕上時再減速滑動),startSmoothScroll()是LayoutManager中的方法
startSmoothScroll(linearSmoothScroller);
}1234567891011
3.LayoutManager中public void startSmoothScroll(SmoothScroller smoothScroller) { //...
mSmoothScroller = smoothScroller; //調用SmoothScroller.start()方法開始滾動,this參數指當前LayoutManager
mSmoothScroller.start(mRecyclerView, this);
}123456
4.SmoothScroller中
void start(RecyclerView recyclerView, LayoutManager layoutManager) { //...
//使用ViewFlinger進行動畫,ViewFlinger實現了Runnable介面,並且內部使用了Scroller,這樣就可以post自己進而對RecyclerView不斷layout就可以實現滑動
mRecyclerView.mViewFlinger.postOnAnimation();
}12345
5.ViewFlinger中,這是實現滑動的重點,省略了很多代碼邏輯
private class ViewFlinger implements Runnable {
@Override
public void run() { if (scroller.computeScrollOffset()) { //調用SmoothScroller的onAnimation方法
smoothScroller.onAnimation(dx - overscrollX, dy - overscrollY);
}
}
}123456789
6.SmoothScroller中private void onAnimation(int dx, int dy) { //...
if (mTargetView != null) { // verify target position
if (getChildPosition(mTargetView) == mTargetPosition) { //要滑動到的位置已經顯示在屏幕上,onTargetFound()方法里update了差值器,由線性差值器變成了減速的差值器。
onTargetFound(mTargetView, recyclerView.mState, mRecyclingAction);
mRecyclingAction.runIfNecessary(recyclerView);
} //...
if (mRunning) { //再下一次滑動
onSeekTargetStep(dx, dy, recyclerView.mState, mRecyclingAction); //調用內部類Action的runIfNecessary方法
mRecyclingAction.runIfNecessary(recyclerView);
}
}12345678910111213141516171819
7.Action中 private void runIfNecessary(RecyclerView recyclerView) { //調用了ViewFlinger.smoothScrollBy()方法,並傳入了mDuration,mDuration是在SmoothScroller中upDate()時傳入的,就是由前文講的兩個方法共同決定的
recyclerView.mViewFlinger.smoothScrollBy(mDx, mDy, mDuration, mInterpolator);
}1234
8.ViewFlinger中開始滾動 public void smoothScrollBy(int dx, int dy, int ration, Interpolator interpolator) { if (mInterpolator != interpolator) {
mInterpolator = interpolator;
mScroller = ScrollerCompat.create(getContext(), interpolator);
}
setScrollState(SCROLL_STATE_SETTLING);
mLastFlingX = mLastFlingY = 0; //調用Scroller開始滾動,此處即ration
mScroller.startScroll(0, 0, dx, dy, ration);
postOnAnimation();
}1234567891011
這塊粗略的按照流程說了一下滾動過程,涉及的類比較多,最終通過Scroller來進行滾動。
結語:本篇文章實現了RecyclerView的快速滾動,但需要注意一個問題:如果你的Item比較復雜,滾動起來會卡頓。 這個在看源碼時的一個注釋裡面有提到,後來實踐時確實也發現。不得不說微信朋友圈滑動起來的真的快,它用的是ListView,貌似開啟了FastEnable屬性。 同時也可以仿照知乎,先使用RecyclerView.scrollToPosition(position)直接滑動到某一個位置後再使用smoothScrollToPosition(0)滑動到頂部。這塊在RecyclerView里的Action類中jumpTo()的注釋里有提到,如果很遠的話可以先到一個位置後再滑動。

㈨ 如何以編程方式滾動的Android的WebView-android,scrolling

事實證明,在window.scrollTo()不工作,你就不能添加您的scrollTo()。對於原因,我自己的scrollTo()方法被調用時,我打電話window.scrollTo()。 因此,簡言之,以滾動的WebView到特定的DOM寫一個javaScript函數來完成滾動:
function scrollToElement(id) {
var elem = document.getElementById(id);
var x = 0;
var y = 0;

while (elem != null) {
x += elem.offsetLeft;
y += elem.offsetTop;
elem = elem.offsetParent;
}
window.scrollTo(x, y);
}

然後從你的Android應用程序(Java代碼),告訴你的WebView載入一個URL:
webView.loadUrl("javascript:scrollToElement('" + elemId + "')");

有這種方法的問題,例如在滾動不會很好地進行動畫處理,但該工程。 DOM的window對象是否正確報告的WebView的當前滾動位置(見window.pageXOffset,window.pageYOffset或window.scrollX,window.scrollY)。如果你只是想知道的WebView的當前滾動位置,編寫JavaScript來調用Java代碼,並沿X / Y偏移量通過。

㈩ android listview 當選中一個item的時候就把這個item滾動到頂端。

listview.smoothScrollToPositonFromTop(position, 0, 60); 三個參數分別是選擇的position,滾動後到頂部的距離,用時多少ms。

閱讀全文

與androidscrollto動畫相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:27
不能修改的pdf 瀏覽:751
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491