知识点:
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>
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>
源码路径:http://download.csdn.net/detail/zhouyuanjing/4764619
分享到:
相关推荐
2. **动态加载**:只有当视图即将显示时才进行加载,不在初始化时一次性加载所有视图。这可以通过监听ViewFlipper的切换事件来实现。 3. **重用现有视图**:如果多个视图有相似的结构,可以尝试共享一个基础视图...
本篇将深入探讨如何利用ViewFlipper通过两个View实现无限播放的效果,这对于创建动态、吸引用户的UI至关重要。 首先,了解ViewFlipper的基本用法。ViewFlipper继承自ViewGroup,可以包含多个子视图(Views)。默认...
`ViewFlipper`是Android平台中的一个视图切换器组件,常用于实现各种动态效果,如广告栏的轮询播放、页面的滑动切换等。它继承自`ViewGroup`,能够管理多个子视图,并在指定的时间间隔内自动或手动进行切换。本篇...
在MVVM架构中,`ViewFlipper`可以与适配器结合使用,动态加载和切换数据驱动的视图,比如图片轮播。 总之,`ViewFlipper`是Android开发者在实现视图切换和轮播效果时的一个强大工具。通过合理运用其内置的功能和...
ViewFlipper是Android开发中的一个视图切换组件,它主要用于实现各种动态效果,如轮播图、卡片翻转等。这个组件是ViewGroup的子类,能够轻松地在多个子视图之间进行切换,同时提供动画效果,使得应用界面更加生动...
通常,这些子视图可以是ImageView、TextView或其他任何视图,这使得ViewFlipper成为一个展示动态内容的理想选择,比如轮播广告或图片库。 要实现循环播放图片,首先你需要在XML布局文件中添加一个ViewFlipper元素,...
如果广告内容需要动态加载,可以通过网络请求获取数据,然后在运行时动态添加到ViewFlipper中。这通常涉及AsyncTask或者Retrofit等网络库的使用,将下载到的图片设置到ImageView,再添加到ViewFlipper。 总结起来...
NotifiableViewFlipper的实现通常需要继承ViewFlipper并重写`onFinishInflate()`方法,以便在所有子视图加载完成后执行初始化操作。同时,你需要提供一个通知接口,让外部类可以订阅切换事件: ```java public ...
你可以创建一个`ArrayAdapter`或`BaseAdapter`,并在`getView()`方法中返回不同的视图,然后在`ViewFlipper`中动态加载这些视图。 通过查看`ViewFlipper使用详解`中的源码,你可以更深入地理解以上概念,并学习如何...
ViewFlipper viewFlipper = findViewById(R.id.view_flipper); List<View> views = new ArrayList(); // 填充你的视图 views.add(view1); views.add(view2); // 添加额外的首尾视图 views.add(0, view1.copy()); // ...
在Android开发中,ViewFlipper是一个非常有用的布局控件,它允许我们轻松地在多个视图之间进行切换,常用于创建动态的用户界面,如轮播图、相册等。本教程将详细介绍如何利用ViewFlipper实现图片的左右滑动、双击...
ViewFlipper viewFlipper = findViewById(R.id.view_flipper); // 设置翻页间隔,单位为毫秒 viewFlipper.setFlipInterval(3000); // 每3秒翻页 // 开启自动翻页 viewFlipper.startFlipping(); // 创建定时器和...
ViewFlipper viewFlipper = findViewById(R.id.view_flipper); viewFlipper.setInAnimation(this, R.anim.slide_in_left); viewFlipper.setOutAnimation(this, R.anim.slide_out_right); final Handler handler = ...
- **数据加载**:在数据加载过程中,可以使用`ViewFlipper`展示不同的加载状态,如加载中、错误提示或空数据视图。 总之,`ViewFlipper`是Android中实现视图切换和动态展示的强大工具,通过灵活运用它的各种功能,...
ViewFlipper是Android SDK中的一个视图容器,它允许开发者在一个布局中动态地显示和隐藏多个视图。在本教程中,我们将深入探讨如何利用ViewFlipper实现图片轮播和图片之间的滑动切换效果。 首先,理解ViewFlipper的...
在这个"ViewFlipperDemo.zip"中,我们很可能会看到一个演示如何使用ViewFlipper来创建动态视图切换的应用示例。 首先,我们要理解ViewFlipper的基本用法。ViewFlipper继承自ViewGroup,这意味着它可以包含一个或多...