1. 程式人生 > >Android ScrollView反彈效果的實現

Android ScrollView反彈效果的實現

自定義ScrollView控制元件:

/**
 * ScrollView反彈效果的實現
 */
public class BounceScrollView extends ScrollView {
	private View inner;// 孩子View

	private float y;// 點選時y座標

	private Rect normal = new Rect();// 矩形(這裡只是個形式,只是用於判斷是否需要動畫.)

	private boolean isCount = false;// 是否開始計算

	public BounceScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	/***
	 * 根據 XML 生成檢視工作完成.該函式在生成檢視的最後呼叫,在所有子檢視新增完之後. 即使子類覆蓋了 onFinishInflate
	 * 方法,也應該呼叫父類的方法,使該方法得以執行.
	 */
	@Override
	protected void onFinishInflate() {
		if (getChildCount() > 0) {
			inner = getChildAt(0);
		}
	}

	/***
	 * 監聽touch
	 */
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		if (inner != null) {
			commOnTouchEvent(ev);
		}

		return super.onTouchEvent(ev);
	}

	/***
	 * 觸控事件
	 * 
	 * @param ev
	 */
	public void commOnTouchEvent(MotionEvent ev) {
		int action = ev.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			break;
		case MotionEvent.ACTION_UP:
			// 手指鬆開.
			if (isNeedAnimation()) {
				animation();
				isCount = false;
			}
			break;
		/***
		 * 排除出第一次移動計算,因為第一次無法得知y座標, 在MotionEvent.ACTION_DOWN中獲取不到,
		 * 因為此時是MyScrollView的touch事件傳遞到到了LIstView的孩子item上面.所以從第二次計算開始.
		 * 然而我們也要進行初始化,就是第一次移動的時候讓滑動距離歸0. 之後記錄準確了就正常執行.
		 */
		case MotionEvent.ACTION_MOVE:
			final float preY = y;// 按下時的y座標
			float nowY = ev.getY();// 時時y座標
			int deltaY = (int) (preY - nowY);// 滑動距離
			if (!isCount) {
				deltaY = 0; // 在這裡要歸0.
			}

			y = nowY;
			// 當滾動到最上或者最下時就不會再滾動,這時移動佈局
			if (isNeedMove()) {
				// 初始化頭部矩形
				if (normal.isEmpty()) {
					// 儲存正常的佈局位置
					normal.set(inner.getLeft(), inner.getTop(),
							inner.getRight(), inner.getBottom());
				}
				Log.e("jj", "矩形:" + inner.getLeft() + "," + inner.getTop()
						+ "," + inner.getRight() + "," + inner.getBottom());
				// 移動佈局
				inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
						inner.getRight(), inner.getBottom() - deltaY / 2);
			}
			isCount = true;
			break;

		default:
			break;
		}
	}

	/***
	 * 回縮動畫
	 */
	public void animation() {
		// 開啟移動動畫
		TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
				normal.top);
		ta.setDuration(200);
		inner.startAnimation(ta);
		// 設定回到正常的佈局位置
		inner.layout(normal.left, normal.top, normal.right, normal.bottom);

		Log.e("jj", "迴歸:" + normal.left + "," + normal.top + "," + normal.right
				+ "," + normal.bottom);

		normal.setEmpty();

	}

	// 是否需要開啟動畫
	public boolean isNeedAnimation() {
		return !normal.isEmpty();
	}

	/***
	 * 是否需要移動佈局 inner.getMeasuredHeight():獲取的是控制元件的總高度
	 * 
	 * getHeight():獲取的是螢幕的高度
	 * 
	 * @return
	 */
	public boolean isNeedMove() {
		int offset = inner.getMeasuredHeight() - getHeight();
		int scrollY = getScrollY();
		Log.e("jj", "scrolly=" + scrollY);
		// 0是頂部,後面那個是底部
		if (scrollY == 0 || scrollY == offset) {
			return true;
		}
		return false;
	}

}
實現反彈效果:
<com.techrare.view.BounceScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/tab_chart_bg"
        android:scrollbars="none" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:orientation="vertical"
            android:paddingLeft="20dp"
            android:paddingRight="20dp" >
<!-- 這裡可以盡情的佈局 -->
        </LinearLayout>
</com.techrare.view.BounceScrollView>


相關推薦

Android ScrollView反彈效果實現

自定義ScrollView控制元件: /** * ScrollView反彈效果的實現 */ public class BounceScrollView extends ScrollView { private View inner;// 孩子View privat

android 水波紋效果實現

drawable color utf true odi lec .com enc orm 1.在drawable文件下,新建seletor,作為button的背景,這裏我用的是兩個圓角的shape <?xml version="1.0" encoding="utf-

Android 水波紋效果實現並且適配API21以下

前言 水波紋的點選效果還是很不錯的,使用起來也很簡單,但是在API21,Android5.0以下使用水波紋效果會直接崩潰,所以我們得考慮到適配 1、在res裡建立drawable-v21資料夾,在該資料夾下建立一個xml檔案 <!-- color_106是一個淺灰色的

Android 跑馬燈效果實現的兩種方式,解決和viewpager的衝突問題

第一篇部落格寫一點簡單的東西,多麼的簡單,就是一個跑馬燈,簡單的要死。所以話不多,寫起來。首先我們來講一個段子先緩和一下氣氛。大學的時候,隔壁宿舍老喜歡蹭我的wifi,煩死了,然後我把wifi名改成了:206有個帥哥是誰。密碼是我的名字,媽的看誰還蹭,結果。除了

android載入圈效果實現

效果圖如下:程式碼下載地址:https://download.csdn.net/download/lv_hang515888/10364791如果從原始碼中複製程式碼載入圈顯示的時候關不了,可以換一下方法。然後把        mWeiboDialog = WeiboDial

Android 導航條效果實現(三) ViewPager+PagerTabStrip

ViewPager+PagerTabStrip實現Tab效果:(ViewPager預設滑動導航條效果) public class PagerTabStrip extends PagerTitleStrip java.lang.Object     ↳

Android ObjectAnimator動畫效果實現

一、 ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f).setDuration(1000).start(); 第一個括號引數:圖片控制元件

Android 導航條效果實現(五) ActionBar+Fragment

ActionBar(已過時,檢視ToolBar)+Fragment實現選項卡的步驟: 當前窗體Activity類要繼承於FragmentActivity,而不是Activity; 獲取ActionBar物件:通過當前上下文物件的getActionBar()方

Android 雷達掃描效果實現

在eoe看到有一篇關於雷達掃描的文章,然後看了下,很簡單,但是覺得還有很多可以優化的地方,下面貼出來 package com.example.wave; import android.content.Context; import android.graphics.Can

AndroidAndroid開發實現帶有反彈效果,仿IOS反彈scrollview詳解教程

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先給大家看一下我們今天這個最終實現的效果圖: 這個是ios中的反彈效果。當然我

Android ScrollView滾動實現大眾點評、網易雲音樂評論懸停效果

ins schema bar 音樂 layout mage for bin andro 今天聽著網易雲音樂,寫著代碼,真是爽翻了。 http://blog.csdn.net/linshijun33/article/details/47910833 網

Android 混排效果ScrollView 巢狀 RecyclerView 巢狀gridview 實現listview 巢狀gridview 效果

RecyclerView 出現以後 很受大家歡迎 漂亮流暢的列表 簡單的操作 可以幫我們完成很多的列表 但是有一種listview 巢狀gridview 的效果 目前還是需要巢狀才能完成 現在就簡單說一下我的思路 本人的需求是例如手機淘寶頁 本人使用老套的實現模

Android 按鍵按下實現陰影效果

nal turn view font .cn ges activity rda als final Button btn_gallery=(Button)findViewById(R.id.btn_gallery);btn_gallery.setOnClickListene

android TextView裏邊實現圖文混配效果

分享 str images for pan override 設置 styles @override 用TextView實現這種效果,圖片文字混排,文字不同顏色字體。打電話和吊起瀏覽器等等 代碼例如以下: @Override public v

Android -- 自定義view實現keep歡迎頁倒計時效果

super onfinish -m use new getc awt ttr alt 1,最近打開keep的app的時候,發現它的歡迎頁面的倒計時效果還不錯,所以打算自己來寫寫,然後就有了這篇文章。 2,還是老規矩,先看一下我們今天實現的效果   相較於我們常見的倒計時

Android自定義View——實現水波紋效果類似剩余流量球

string 三個點 pre ber block span 初始化 move 理解 最近突然手癢就想搞個貝塞爾曲線做個水波紋效果玩玩,終於功夫不負有心人最後實現了想要的效果,一起來看下吧: 效果圖鎮樓 一:先一步一步來分解一下實現的過程 需要繪制一個正弦曲線(sin

Xamarin.android Activity動畫切換效果實現

omx over tails detail ons too ide xamarin Coding http://blog.csdn.net/esunshine1985/article/details/44302903 1.在Resources——values下新建sty

Android 新手引導半透明蒙層效果實現

效果圖: 其中的文字和我知道啦是ui切得兩張透明圖片 自定義View: package com.cymobi.library.view.widget; import android.app.Activity; import android.content.Conte

android:多次點選效果實現

public class MainActivity extends AppCompatActivity{ private final static int COUNTS = 5;//點選次數 private final static long VALIDTIME = 1300;/

Android 卡片邊框模糊陰影效果實現

1. 使用<shape>標籤實現 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">