ViewFlipper动态加载View

转自:http://blog.csdn.net/zhouyuanjing/article/details/8181041


知识点:

     1.ViewFlipper基本用法及动态添加View;

     2.ViewFlipper结合手势翻页+特效;

     3.WindowManager的基本用法。

任意张图片实现循环滑动,其实PageFlipper当前最多的子View个数(ChildViewCount)小于等于2.


源码路径:http://download.csdn.net/detail/zhouyuanjing/4764619


fliper_item.xml:

[java]  view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:gravity="center" >  
  6.   
  7.     
  8.         android:id="@+id/img"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:gravity="center" />  
  12.   
  13.   

main.xml:

[java]  view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     
  8.         android:id="@+id/myViewFlipper"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent" >  
  11.           
  12.       
  13.   
  14.   

MainActivity.java:

[java]  view plain copy
  1. package com.xyz.pagefilter;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.PixelFormat;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.GestureDetector;  
  10. import android.view.GestureDetector.OnGestureListener;  
  11. import android.view.Gravity;  
  12. import android.view.LayoutInflater;  
  13. import android.view.MotionEvent;  
  14. import android.view.View;  
  15. import android.view.View.OnTouchListener;  
  16. import android.view.Window;  
  17. import android.view.WindowManager;  
  18. import android.view.WindowManager.LayoutParams;  
  19. import android.widget.ImageView;  
  20. import android.widget.ViewFlipper;  
  21.   
  22. public class MainActivity extends Activity implements OnTouchListener,  
  23.         OnGestureListener {  
  24.   
  25.     private LayoutInflater mInflater;  
  26.     private WindowManager wm = null;  
  27.     private WindowManager.LayoutParams wmParams = null;  
  28.   
  29.     private ImageView leftbtn = null;  
  30.     private ImageView rightbtn = null;  
  31.   
  32.     private int mAlpha = 0;  
  33.     private boolean isHide;  
  34.   
  35.     private int mCurrPos = 0;  
  36.   
  37.     private ViewFlipper viewFlipper = null;  
  38.     private GestureDetector mGestureDetector;  
  39.   
  40.     private int[] mImages = new int[] { R.drawable.img_0, R.drawable.img_1,  
  41.             R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,  
  42.             R.drawable.img_5, R.drawable.img_6, R.drawable.img_7,  
  43.             R.drawable.img_8, R.drawable.img_9 };  
  44.   
  45.     @Override  
  46.     public void onCreate(Bundle savedInstanceState) {  
  47.         super.onCreate(savedInstanceState);  
  48.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  49.         setContentView(R.layout.main);  
  50.   
  51.         mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  52.         viewFlipper = (ViewFlipper) this.findViewById(R.id.myViewFlipper);  
  53.         setView(mCurrPos, 0);  
  54.         initFloatView();  
  55.   
  56.         // viewFlipper.setLongClickable(true);  
  57.         viewFlipper.setOnTouchListener(this);  
  58.         mGestureDetector = new GestureDetector(this);  
  59.   
  60.     }  
  61.   
  62.     private void initFloatView() {  
  63.         wm = (WindowManager) getApplicationContext().getSystemService(  
  64.                 Context.WINDOW_SERVICE);  
  65.         wmParams = new WindowManager.LayoutParams();  
  66.   
  67.         wmParams.type = LayoutParams.TYPE_PHONE;   
  68.         wmParams.format = PixelFormat.RGBA_8888;   
  69.           
  70.         wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL  
  71.                 | LayoutParams.FLAG_NOT_FOCUSABLE;  
  72.   
  73.         wmParams.x = 0;  
  74.         wmParams.y = 0;  
  75.   
  76.         wmParams.width = 50;  
  77.         wmParams.height = 50;  
  78.   
  79.         createLeftFloatView();  
  80.         createRightFloatView();  
  81.     }  
  82.   
  83.     private void createLeftFloatView() {  
  84.         leftbtn = new ImageView(this);  
  85.         leftbtn.setImageResource(R.drawable.prev);  
  86.         leftbtn.setAlpha(0);  
  87.         leftbtn.setOnClickListener(new View.OnClickListener() {  
  88.             public void onClick(View arg0) {  
  89.                 movePrevious();  
  90.             }  
  91.         });  
  92.           
  93.         wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;  
  94.           
  95.         wm.addView(leftbtn, wmParams);  
  96.     }  
  97.   
  98.     private void createRightFloatView() {  
  99.         rightbtn = new ImageView(this);  
  100.         rightbtn.setImageResource(R.drawable.next);  
  101.         rightbtn.setAlpha(0);  
  102.         rightbtn.setOnClickListener(new View.OnClickListener() {  
  103.             public void onClick(View arg0) {  
  104.                 moveNext();  
  105.             }  
  106.         });  
  107.           
  108.         wmParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;  
  109.           
  110.         wm.addView(rightbtn, wmParams);  
  111.     }  
  112.   
  113.     private void setView(int curr, int next) {  
  114.         View v = (View) mInflater.inflate(R.layout.flipper_item, null);  
  115.         ImageView iv = (ImageView) v.findViewById(R.id.img);  
  116.         // iv.setScaleType(ImageView.ScaleType.FIT_XY);  
  117.         if (curr < next && next > mImages.length - 1)  
  118.             next = 0;  
  119.         else if (curr > next && next < 0)  
  120.             next = mImages.length - 1;  
  121.         iv.setImageResource(mImages[next]);  
  122.         if (viewFlipper.getChildCount() > 1) {  
  123.             viewFlipper.removeViewAt(0);  
  124.         }  
  125.         viewFlipper.addView(v, viewFlipper.getChildCount());  
  126.         mCurrPos = next;  
  127.   
  128.     }  
  129.   
  130.     private void movePrevious() {  
  131.         setView(mCurrPos, mCurrPos - 1);  
  132.         viewFlipper.setInAnimation(MainActivity.this, R.anim.in_leftright);  
  133.         viewFlipper.setOutAnimation(MainActivity.this, R.anim.out_leftright);  
  134.         viewFlipper.showPrevious();  
  135.     }  
  136.   
  137.     private void moveNext() {  
  138.         setView(mCurrPos, mCurrPos + 1);  
  139.         viewFlipper.setInAnimation(MainActivity.this, R.anim.in_rightleft);  
  140.         viewFlipper.setOutAnimation(MainActivity.this, R.anim.out_rightleft);  
  141.         viewFlipper.showNext();  
  142.     }  
  143.   
  144.     private Handler mHandler = new Handler() {  
  145.         public void handleMessage(Message msg) {  
  146.             if (msg.what == 1 && mAlpha < 255) {  
  147.                 mAlpha += 50;  
  148.                 if (mAlpha > 255)  
  149.                     mAlpha = 255;  
  150.                 leftbtn.setAlpha(mAlpha);  
  151.                 leftbtn.invalidate();  
  152.                 rightbtn.setAlpha(mAlpha);  
  153.                 rightbtn.invalidate();  
  154.                 if (!isHide && mAlpha < 255)  
  155.                     mHandler.sendEmptyMessageDelayed(1100);  
  156.             } else if (msg.what == 0 && mAlpha > 0) {  
  157.                 mAlpha -= 10;  
  158.                 if (mAlpha < 0)  
  159.                     mAlpha = 0;  
  160.                 leftbtn.setAlpha(mAlpha);  
  161.                 leftbtn.invalidate();  
  162.                 rightbtn.setAlpha(mAlpha);  
  163.                 rightbtn.invalidate();  
  164.                 if (isHide && mAlpha > 0)  
  165.                     mHandler.sendEmptyMessageDelayed(0100);  
  166.             }  
  167.         }  
  168.     };  
  169.   
  170.     private void showFloatView() {  
  171.         isHide = false;  
  172.         mHandler.sendEmptyMessage(1);  
  173.     }  
  174.   
  175.     private void hideFloatView() {  
  176.         new Thread() {  
  177.             public void run() {  
  178.                 try {  
  179.                     Thread.sleep(1500);  
  180.                     isHide = true;  
  181.                     mHandler.sendEmptyMessage(0);  
  182.                 } catch (Exception e) {  
  183.                 }  
  184.             }  
  185.         }.start();  
  186.     }  
  187.   
  188.     @Override  
  189.     public void onDestroy() {  
  190.         super.onDestroy();  
  191.         wm.removeView(leftbtn);  
  192.         wm.removeView(rightbtn);  
  193.     }  
  194.   
  195.     @Override  
  196.     public boolean onDown(MotionEvent e) {  
  197.         return false;  
  198.     }  
  199.   
  200.     @Override  
  201.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  202.             float velocityY) {  
  203.         int x = (int) (e2.getX() - e1.getX());  
  204.         if (x > 0) {  
  205.             movePrevious();  
  206.         } else {  
  207.             moveNext();  
  208.         }  
  209.         return false;  
  210.     }  
  211.   
  212.     @Override  
  213.     public void onLongPress(MotionEvent e) {  
  214.   
  215.     }  
  216.   
  217.     @Override  
  218.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  219.             float distanceY) {  
  220.         return false;  
  221.     }  
  222.   
  223.     @Override  
  224.     public void onShowPress(MotionEvent e) {  
  225.         // 用户轻触屏幕,尚末松开或拖动,注意,强调的是没有没有松开或者拖动状态  
  226.     }  
  227.   
  228.     @Override  
  229.     public boolean onSingleTapUp(MotionEvent e) {  
  230.         return false;  
  231.     }  
  232.   
  233.     @Override  
  234.     public boolean onTouch(View v, MotionEvent event) {  
  235.         switch (event.getAction()) {  
  236.         case MotionEvent.ACTION_MOVE:  
  237.         case MotionEvent.ACTION_DOWN:  
  238.             showFloatView();  
  239.             break;  
  240.         case MotionEvent.ACTION_UP:  
  241.             hideFloatView();  
  242.             break;  
  243.         }  
  244.         mGestureDetector.onTouchEvent(event);  
  245.         return true;  
  246.     }  
  247. }  

附加特效文件:

in_leftright.xml:

[cpp]  view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android" >  
  3.   
  4.     
  5.         android:duration="500"  
  6.         android:fromXDelta="-100%p"  
  7.         android:toXDelta="0" />  
  8.   
  9.     
  10.         android:duration="500"  
  11.         android:fromAlpha="0.0"  
  12.         android:toAlpha="1.0" />  
  13.   
  14.   
in_rightleft.xml:

[java]  view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android" >  
  3.     
  4.         android:duration="500"  
  5.         android:fromXDelta="100%p"  
  6.         android:toXDelta="0" />  
  7.       
  8.     
  9.         android:duration="500"  
  10.         android:fromAlpha="0.0"  
  11.         android:toAlpha="1.0" />  
  12.   
out_leftright.xml:

[java]  view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android" >  
  3.     
  4.         android:duration="500"  
  5.         android:fromXDelta="0"  
  6.         android:toXDelta="100%p" />  
  7.       
  8.     
  9.         android:duration="500"  
  10.         android:fromAlpha="1.0"  
  11.         android:toAlpha="0.0" />  
  12.   
out_rightleft.xml:

[java]  view plain copy
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android" >  
  3.   
  4.     
  5.         android:duration="500"  
  6.         android:fromXDelta="0"  
  7.         android:toXDelta="-100%p" />  
  8.   
  9.     
  10.         android:duration="500"  
  11.         android:fromAlpha="1.0"  
  12.         android:toAlpha="0.0" />  
  13.   
  14.   

源码路径:http://download.csdn.net/detail/zhouyuanjing/4764619

你可能感兴趣的:(android,进阶)