1. 程式人生 > >Android重寫HorizontalScrollView模仿ViewPager效果

Android重寫HorizontalScrollView模仿ViewPager效果

Android提供的ViewPager類太複雜,有時候沒有必要使用,所以重寫一個HorizontalScrollView來實現類似的效果,也可以當做Gallery來用

思路很簡單,就是重寫onTouchEvent事件,在手指擡起或者取消的時候,進行smoothScroll的操作,具體請看程式碼:

佈局檔案:activity_test.xml

複製程式碼
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <com.example.testxinye.MyScrollView 
 3     xmlns:android="http://schemas.android.com/apk/res/android"
4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 <LinearLayout 8 android:id="@+id/container" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:orientation="horizontal" >
12 13 </LinearLayout> 14 </com.example.testxinye.MyScrollView>
複製程式碼

Activity類:TestActivity.java

複製程式碼
 1 package com.example.testxinye;
 2 
 3 import android.app.Activity;
 4 import android.graphics.Color;
 5 import android.os.Bundle;
 6 import android.util.DisplayMetrics;
 7 import
android.widget.ImageView; 8 import android.widget.ImageView.ScaleType; 9 import android.widget.LinearLayout; 10 import android.widget.LinearLayout.LayoutParams; 11 /** 12 * 13 * @author xinye 14 * 15 */ 16 public class TestActivity extends Activity { 17 private LinearLayout mContainer = null; 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 // TODO Auto-generated method stub 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_test); 23 24 mContainer = (LinearLayout) findViewById(R.id.container); 25 26 LayoutParams params = new LayoutParams(getWinWidth(), getWinHeight()); 27 28 ImageView imageView1 = new ImageView(this); 29 imageView1.setLayoutParams(params); 30 imageView1.setImageResource(R.drawable.call_show_medal5); 31 imageView1.setScaleType(ScaleType.CENTER); 32 mContainer.addView(imageView1); 33 34 ImageView imageView2 = new ImageView(this); 35 imageView2.setLayoutParams(params); 36 imageView2.setImageResource(R.drawable.call_show_medal1); 37 imageView2.setScaleType(ScaleType.CENTER); 38 imageView2.setBackgroundColor(Color.RED); 39 mContainer.addView(imageView2); 40 41 ImageView imageView3 = new ImageView(this); 42 imageView3.setLayoutParams(params); 43 imageView3.setImageResource(R.drawable.call_show_medal2); 44 imageView3.setScaleType(ScaleType.CENTER); 45 imageView3.setBackgroundColor(Color.GRAY); 46 mContainer.addView(imageView3); 47 48 49 ImageView imageView4 = new ImageView(this); 50 imageView4.setLayoutParams(params); 51 imageView4.setImageResource(R.drawable.call_show_medal3); 52 imageView4.setScaleType(ScaleType.CENTER); 53 imageView4.setBackgroundColor(Color.BLUE); 54 mContainer.addView(imageView4); 55 56 57 ImageView imageView5 = new ImageView(this); 58 imageView5.setLayoutParams(params); 59 imageView5.setImageResource(R.drawable.call_show_medal4); 60 imageView5.setScaleType(ScaleType.CENTER); 61 imageView5.setBackgroundColor(Color.GREEN); 62 mContainer.addView(imageView5); 63 64 65 66 } 67 68 @Override 69 protected void onResume() { 70 // ((MyScrollView)mContainer.getParent()).init(); 71 super.onResume(); 72 } 73 74 private int getWinWidth(){ 75 DisplayMetrics dm = new DisplayMetrics(); 76 //獲取螢幕資訊 77 getWindowManager().getDefaultDisplay().getMetrics(dm); 78 return dm.widthPixels; 79 } 80 private int getWinHeight(){ 81 DisplayMetrics dm = new DisplayMetrics(); 82 //獲取螢幕資訊 83 getWindowManager().getDefaultDisplay().getMetrics(dm); 84 return dm.heightPixels; 85 } 86 }
複製程式碼

重寫的HorizontalScrollView:MyScrollView.java

複製程式碼
  1 package com.example.testxinye;
  2 
  3 import java.util.ArrayList;
  4 
  5 import android.content.Context;
  6 import android.util.AttributeSet;
  7 import android.view.MotionEvent;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.HorizontalScrollView;
 11 /**
 12  * 
 13  * @author XINYE
 14  *
 15  */
 16 public class MyScrollView extends HorizontalScrollView {
 17     private int subChildCount = 0;
 18     private ViewGroup firstChild = null;
 19     private int downX = 0;
 20     private int currentPage = 0;
 21     private ArrayList<Integer> pointList = new ArrayList<Integer>();
 22     
 23     public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
 24         super(context, attrs, defStyle);
 25         init();
 26     }
 27 
 28 
 29     public MyScrollView(Context context, AttributeSet attrs) {
 30         super(context, attrs);
 31         init();
 32     }
 33 
 34     public MyScrollView(Context context) {
 35         super(context);
 36         init();
 37     }
 38     private void init() {
 39         setHorizontalScrollBarEnabled(false);
 40     }
 41     @Override
 42     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 43         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 44         receiveChildInfo();
 45     }
 46     public void receiveChildInfo() {
 47         
 48         firstChild = (ViewGroup) getChildAt(0);
 49         if(firstChild != null){
 50             subChildCount = firstChild.getChildCount();
 51             for(int i = 0;i < subChildCount;i++){
 52                 if(((View)firstChild.getChildAt(i)).getWidth() > 0){
 53                     pointList.add(((View)firstChild.getChildAt(i)).getLeft());
 54                 }
 55             }
 56         }
 57 
 58     }
 59     @Override
 60     public boolean onTouchEvent(MotionEvent ev) {
 61         switch (ev.getAction()) {
 62         case MotionEvent.ACTION_DOWN:
 63             downX = (int) ev.getX();
 64             break;
 65         case MotionEvent.ACTION_MOVE:{
 66             
 67         }break;
 68         case MotionEvent.ACTION_UP:
 69         case MotionEvent.ACTION_CANCEL:{
 70             if( Math.abs((ev.getX() - downX)) > getWidth() / 4){
 71                 if(ev.getX() - downX > 0){
 72                     smoothScrollToPrePage();
 73                 }else{
 74                     smoothScrollToNextPage();
 75                 }
 76             }else{            
 77                 smoothScrollToCurrent();
 78             }
 79             return true;
 80         }
 81         }
 82         return super.onTouchEvent(ev);
 83     }
 84 
 85     private void smoothScrollToCurrent() {
 86         smoothScrollTo(pointList.get(currentPage), 0);
 87     }
 88 
 89     private void smoothScrollToNextPage() {
 90         if(currentPage < subChildCount - 1){
 91             currentPage++;
 92             smoothScrollTo(pointList.get(currentPage), 0);
 93         }
 94     }
 95 
 96     private void smoothScrollToPrePage() {
 97         if(currentPage > 0){            
 98             currentPage--;
 99             smoothScrollTo(pointList.get(currentPage), 0);
100         }
101     }
102     /**
103      * 下一頁
104      */
105     public void nextPage(){
106         smoothScrollToNextPage();
107     }
108     /**
109      * 上一頁
110      */
111     public void prePage(){
112         smoothScrollToPrePage();
113     }
114     /**
115      * 跳轉到指定的頁面
116      * @param page
117      * @return
118      */
119     public boolean gotoPage(int page){
120         if(page > 0 && page < subChildCount - 1){
121             smoothScrollTo(pointList.get(page), 0);
122             currentPage = page;
123             return true;
124         }
125         return false;
126     }
127 }
複製程式碼

相關推薦

Android重寫HorizontalScrollView模仿ViewPager效果

Android提供的ViewPager類太複雜,有時候沒有必要使用,所以重寫一個HorizontalScrollView來實現類似的效果,也可以當做Gallery來用 思路很簡單,就是重寫onTouchEvent事件,在手指擡起或者取消的時候,進行smoothScrol

移動開發----Android模仿打字機效果的自定義View實現

前言   在做splash介面的時候,需要做類似於打字機打字的效果,字一個一個地蹦出來,顯示每一個字都帶有打字的聲音。 效果演示 實現原理:   這個其實不難實現,通過一個定時器不斷呼叫TextView的setText就行了,在setTex

Android 應用開發----7. ViewPager+Fragment一步步打造頂部導航介面滑動效果

ViewPager+Fragment一步步打造頂部導航介面滑動效果 在許多應用中,我們常常用到這麼一個效果: 可以看到,由於現在的應用資料經常需要涉及到多個模組,所以常常需要使用滑動標籤在多個頁面之間跳轉,實現這樣的效果有很多種方式(比如系統自帶的tabhost控

android開發之&使用ViewPager加gridView實現選單按鈕分頁滑動(類似QQ表情選擇翻頁效果

剛做的專案中要用到選單分頁,以前沒做過,仔細想了想,既然是分頁,肯定就少不了ViewPager,大家都知道gridView可以實現九宮格,剛好滿足我們的需求,我做的是gridview單行顯示,大家如果需要向QQ表情一樣多行顯示,直接修改資料來源就可以。 好了,上程式碼 pu

Android介面實現】使用ScrollingTabsView實現有滑動標籤的ViewPager效果

    在前面的文章中,我們使用支援包裡面的PagerTabStrip實現了有滑動標籤的viewPager效果,今天,再給大家介紹另外一種開源專案,來實現類似的效果。     在這篇文章中,我們將使用第三方開源專案ViewPagerExtensions實現。     先看

Android 中使用 RecyclerView + SnapHelper 實現類似 ViewPager 效果

寫在前面:強大的Recyclerview,官方提供的幫助類. 1 前言 在 一些特定的場景下,如照片的瀏覽,卡片列表滑動瀏覽,我們希望當滑動停止時可以將當前的照片或者卡片停留在螢幕中央,以吸引使用者的焦點。在 Android 中,我們可以使用RecyclerView

Android HorizontalScrollView回彈效果

轉載記錄備份查閱 import android.annotation.SuppressLint; import android.os.Build; import android.util.Log; import android.view.MotionEvent

Android-通過自定義ViewPager(中間放大效果

/**稀土掘金,時光不老**/ 大家好,很早就想寫部落格了,一是工作忙,二是缺乏原創性,三當然是自己的能力不夠啦,寫這篇部落格是很惶恐。。。。請多多包涵 /**************************** --------   ---------          

Android重寫ViewPager修改滑動靈敏度

使用ViewPager作為一個頁面進行切換,裡面可以存放很多View,但有時在操作View時不小心滑動一下就有可能跳到下一頁,這並不是我們想要的,這裡就需要重寫ViewPager修改它的滑動條件 效果圖 程式目錄結構 BTViewPager.java

Android重寫view時onAttachedToWindow () 和 onDetachedFromWindow ()

intent action efault tor null lock 相對 ext.get pre 在重寫View的時候,會遇到這兩個方法 protected void onAttachedToWindow() Description copied from

android 仿ppt進入動畫效果合集

ppt 效果 動畫 android 進入 EnterAnimationandroid 仿ppt進入動畫效果合集, 百葉窗效果,擦除效果,盒狀效果,階梯效果,菱形效果,輪子效果,劈裂效果,棋盤效果, 切入效果,扇形展開效果,十字擴展效果,隨機線條效果,向內溶解效果,圓形擴展效果, 適用於各種

小程序模仿toast效果

set 找不到 function parseint mon log port 方法 方便 template建立toast模板 <!--wxapp-toast start--> <template name="toast"> &l

Android------Button 添加聲音效果(兩種方式)

div abs 一次 播放 pool 當前 傳送門 ide col 我在先前的案例《Android 的底部導航欄 BottomNavigationBar》中添加以底部 的4個按鈕切換添加聲音 下來看看案例效果圖 使用添加依賴 comp

Android 解決RecyclerView瀑布流效果結合Glide使用時圖片變形的問題

變形 into 想要 pla enter glide加載圖片 pan etc clas 問題描述:使用Glide加載RecyclerView的Item中的圖片,RecyclerView使用了瀑布流展示圖片,但是滾動時圖片會不斷的加載,並且大小位置都會改變,造成顯示錯亂。

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">

Android TabLayout在與viewpager AppBarLayout一起使用時出現tab選中後下劃線滑動緩慢,卡頓異常解決方案

今天早上剛測試發現的一個問題,之前沒有注意到,特別尷尬感覺,之前經常使用TabLayout和viewpager聯動切換碎片,異常的情況如下圖展示: 佈局程式碼如下: <?xml version="1.0" encoding="utf-8"?> <android.s

Android 露珠/水滴 拖拽 效果實現

解釋一下標題: 露珠拖拽/水滴拖拽:就是一個View不但能跟著手滑動。還能根據滑動速度,改變形狀,像露珠或者水滴那樣。 這裡是效果實現的Demo 具體實現就是如下一個Java檔案 DewdropView.java package com.demo.dewdropdemo; i

Android 去除Button預設陰影效果並新增自定義陰影

1、首先先說一下預設的陰影效果 // Java setStateListAnimator(null); // xml android:stateListAnimator="@null" 2、自定義陰影實現的方式有很多種 a、將Button分層,將兩層的背景區分開就OK,但

android實現自定義相機效果

樓主在進行android開發時用到了自定義攝像頭拍照並將所拍攝的照片轉化成二進位制流輸出這一功能(當然程式裡也附帶將圖片儲存在sd卡里的功能),花了好多天的時間查了很多資料最後終於把它給搞出來了。。。 來~~~直接上圖~~~ 首先先搞出界面佈局來 <?xml version=