知识点
1.ViewFlipper基本用法及动态添加View;
2.ViewFlipper结合手势翻页+特效;
3.WindowManager的基本用法。
任意张图片实现循环滑动,其实PageFlipper当前最多的子View个数(ChildViewCount)小于等于2.
<?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>
<?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>
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>
in_rightleft.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>
out_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="0" android:toXDelta="100%p" /> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
out_rightleft.xml:
<?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>
ViewFlipper动态加载View,布布扣,bubuko.com
原文:http://www.cnblogs.com/linximeng/p/3747504.html