转自: 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:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="center" >
- <ImageView
- android:id="@+id/img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center" />
- </LinearLayout>
main.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <ViewFlipper
- android:id="@+id/myViewFlipper"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- </ViewFlipper>
- </LinearLayout>
MainActivity.java:
- package com.xyz.pagefilter;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.PixelFormat;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.GestureDetector;
- import android.view.GestureDetector.OnGestureListener;
- import android.view.Gravity;
- import android.view.LayoutInflater;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View.OnTouchListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.view.WindowManager.LayoutParams;
- import android.widget.ImageView;
- import android.widget.ViewFlipper;
- public class MainActivity extends Activity implements OnTouchListener,
- OnGestureListener {
- private LayoutInflater mInflater;
- private WindowManager wm = null;
- private WindowManager.LayoutParams wmParams = null;
- private ImageView leftbtn = null;
- private ImageView rightbtn = null;
- private int mAlpha = 0;
- private boolean isHide;
- private int mCurrPos = 0;
- private ViewFlipper viewFlipper = null;
- private GestureDetector mGestureDetector;
- private int[] mImages = new int[] { R.drawable.img_0, R.drawable.img_1,
- R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
- R.drawable.img_5, R.drawable.img_6, R.drawable.img_7,
- R.drawable.img_8, R.drawable.img_9 };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- viewFlipper = (ViewFlipper) this.findViewById(R.id.myViewFlipper);
- setView(mCurrPos, 0);
- initFloatView();
- // viewFlipper.setLongClickable(true);
- viewFlipper.setOnTouchListener(this);
- mGestureDetector = new GestureDetector(this);
- }
- private void initFloatView() {
- wm = (WindowManager) getApplicationContext().getSystemService(
- Context.WINDOW_SERVICE);
- wmParams = new WindowManager.LayoutParams();
- wmParams.type = LayoutParams.TYPE_PHONE;
- wmParams.format = PixelFormat.RGBA_8888;
- wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
- | LayoutParams.FLAG_NOT_FOCUSABLE;
- wmParams.x = 0;
- wmParams.y = 0;
- wmParams.width = 50;
- wmParams.height = 50;
- createLeftFloatView();
- createRightFloatView();
- }
- private void createLeftFloatView() {
- leftbtn = new ImageView(this);
- leftbtn.setImageResource(R.drawable.prev);
- leftbtn.setAlpha(0);
- leftbtn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View arg0) {
- movePrevious();
- }
- });
- wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
- wm.addView(leftbtn, wmParams);
- }
- private void createRightFloatView() {
- rightbtn = new ImageView(this);
- rightbtn.setImageResource(R.drawable.next);
- rightbtn.setAlpha(0);
- rightbtn.setOnClickListener(new View.OnClickListener() {
- public void onClick(View arg0) {
- moveNext();
- }
- });
- wmParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
- wm.addView(rightbtn, wmParams);
- }
- private void setView(int curr, int next) {
- View v = (View) mInflater.inflate(R.layout.flipper_item, null);
- ImageView iv = (ImageView) v.findViewById(R.id.img);
- // iv.setScaleType(ImageView.ScaleType.FIT_XY);
- if (curr < next && next > mImages.length - 1)
- next = 0;
- else if (curr > next && next < 0)
- next = mImages.length - 1;
- iv.setImageResource(mImages[next]);
- if (viewFlipper.getChildCount() > 1) {
- viewFlipper.removeViewAt(0);
- }
- viewFlipper.addView(v, viewFlipper.getChildCount());
- mCurrPos = next;
- }
- private void movePrevious() {
- setView(mCurrPos, mCurrPos - 1);
- viewFlipper.setInAnimation(MainActivity.this, R.anim.in_leftright);
- viewFlipper.setOutAnimation(MainActivity.this, R.anim.out_leftright);
- viewFlipper.showPrevious();
- }
- private void moveNext() {
- setView(mCurrPos, mCurrPos + 1);
- viewFlipper.setInAnimation(MainActivity.this, R.anim.in_rightleft);
- viewFlipper.setOutAnimation(MainActivity.this, R.anim.out_rightleft);
- viewFlipper.showNext();
- }
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- if (msg.what == 1 && mAlpha < 255) {
- mAlpha += 50;
- if (mAlpha > 255)
- mAlpha = 255;
- leftbtn.setAlpha(mAlpha);
- leftbtn.invalidate();
- rightbtn.setAlpha(mAlpha);
- rightbtn.invalidate();
- if (!isHide && mAlpha < 255)
- mHandler.sendEmptyMessageDelayed(1, 100);
- } else if (msg.what == 0 && mAlpha > 0) {
- mAlpha -= 10;
- if (mAlpha < 0)
- mAlpha = 0;
- leftbtn.setAlpha(mAlpha);
- leftbtn.invalidate();
- rightbtn.setAlpha(mAlpha);
- rightbtn.invalidate();
- if (isHide && mAlpha > 0)
- mHandler.sendEmptyMessageDelayed(0, 100);
- }
- }
- };
- private void showFloatView() {
- isHide = false;
- mHandler.sendEmptyMessage(1);
- }
- private void hideFloatView() {
- new Thread() {
- public void run() {
- try {
- Thread.sleep(1500);
- isHide = true;
- mHandler.sendEmptyMessage(0);
- } catch (Exception e) {
- }
- }
- }.start();
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- wm.removeView(leftbtn);
- wm.removeView(rightbtn);
- }
- @Override
- public boolean onDown(MotionEvent e) {
- return false;
- }
- @Override
- public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
- float velocityY) {
- int x = (int) (e2.getX() - e1.getX());
- if (x > 0) {
- movePrevious();
- } else {
- moveNext();
- }
- return false;
- }
- @Override
- public void onLongPress(MotionEvent e) {
- }
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
- float distanceY) {
- return false;
- }
- @Override
- public void onShowPress(MotionEvent e) {
- // 用户轻触屏幕,尚末松开或拖动,注意,强调的是没有没有松开或者拖动状态
- }
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- return false;
- }
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_MOVE:
- case MotionEvent.ACTION_DOWN:
- showFloatView();
- break;
- case MotionEvent.ACTION_UP:
- hideFloatView();
- break;
- }
- mGestureDetector.onTouchEvent(event);
- return true;
- }
- }
附加特效文件:
in_leftright.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="500"
- android:fromXDelta="-100%p"
- android:toXDelta="0" />
- <alpha
- android:duration="500"
- android:fromAlpha="0.0"
- android:toAlpha="1.0" />
- </set>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="500"
- android:fromXDelta="100%p"
- android:toXDelta="0" />
- <alpha
- android:duration="500"
- android:fromAlpha="0.0"
- android:toAlpha="1.0" />
- </set>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="500"
- android:fromXDelta="0"
- android:toXDelta="100%p" />
- <alpha
- android:duration="500"
- android:fromAlpha="1.0"
- android:toAlpha="0.0" />
- </set>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="500"
- android:fromXDelta="0"
- android:toXDelta="-100%p" />
- <alpha
- android:duration="500"
- android:fromAlpha="1.0"
- android:toAlpha="0.0" />
- </set>
源码路径:http://download.csdn.net/detail/zhouyuanjing/4764619