ViewFlipper动态加载View

知识点

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);
&nbsp;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

时间: 2024-11-08 18:00:49

ViewFlipper动态加载View的相关文章

android 动态加载View

在布局中动态加载View 1.主布局的funddatail.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=&q

viewFlipper动态加载

同一时间内,只有2个view,index分别为0和1 删掉一个后加入一个,保持动态更新 if (viewFlipper.getChildCount() > 1) { viewFlipper.removeViewAt(0); } viewFlipper.addView(v, viewFlipper.getChildCount());

Android 实现布局动态加载

Android 动态加载布局 通过使用LayoutInflater 每次点击按钮时候去读取布局文件,然后找到布局文件里面的各个VIEW 操作完VIEW 后加载进我们setContentView 方面里面的要放的布局文件里面,每次动态加载文件必需 调用 removeAllViews方法,清除之前的加载进来的 View .是不是很简单?当然动态加载VIEW 还有许多种方法,多尝试不同写法.可能会领会不一样的心得,祝你早上掌握android 的开发技术. 主要原理:在一个分割出来的大的Layout中(

动态加载Layout 与 论Activity、 Window、View的关系

1)动态加载Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); 它等同于 setContentView(R.layout.main); 其实 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))  是 setContentView(R.layout.

用collection view动态加载数据卡顿的可能原因

在用collectionview动态加载数据时有个好处,就是cell得到了复用,如果整屏显示一个cell,最多只有两个cell,坏处就是需要不断的刷新cell,这时候容易卡顿. 每次滑动collectionview会调用代理方法,获取新的cell,这时你要将数据传给cell并进行显示. 现在的情况是快速滑动的时候和慢速滑动的时候不会卡顿,快速滑动的时候不会请求数据,所以卡顿原因可能是在请求数据的时候,慢速滑动的时候因为间隔时间长,数据应该都加载好了,所以卡顿原因可能是间隔过短,cell已经被创建

黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

一.AngularJS动态加载控制器和视图实例 路由配置关键代码: [javascript] view plain copy print? //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据和控制器***/ views: { "": { templateUrl: function ($stateParams) { console.info($stateParams); return '/template/

项目总结—jQuery EasyUI-DataGrid动态加载表头

http://blog.csdn.net/zwk626542417/article/details/19248747 概要 在前面两篇文章中,我们已经介绍了在jQuery EasyUI-DataGrid中有参数和无参数的情况下将数据库中数据显示到前台,但是对于前面两篇文章显示的数据表头是固定的,如果我们显示到前台的数据来自数据库不同的表,那么表头也需要动态的加载,这篇文章我们就来看下在EasyUI-DataGrid中动态加载表头和数据. 实现 我们要实现的功能是根据我们的需要,让DataGrid

Android动态加载XML文件及控件来简单实现QQ好友印象的功能

在android开发中,我们常常会遇到界面布局控件不确定的情况.由于某些功能的原因或者为了体现某些app的特色等这些原因会导致我们在实现界面布局时需要动态去加载一些控件,那么下面就来介绍一下如何用动态加载控件来简单实现QQ中好友印象的功能,其中也会提到如何来动态加载一个XML的配置文件. 那么要实现好友印象的功能,我们需要通过以下这几个步骤: 1.界面一开始需要加载一个EditText和Button控件,用于填写好友印象和添加好友印象: 2.需要新建一个arrays.xml,在xml文件中添加上

实现Android 动态加载APK(Fragment or Activity实现)

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 最近由于项目太大了,导致编译通不过(Android对一个应用中的方法个数貌似有限制),所以一直琢磨着能否将某些模块的APK不用安装,动态加载,通过在网上查找资料和网友的帮助,终于实现了APK的动态加载,网络上介绍APK动态加载的文章非常多,但是我觉得写得非常好的就是这位大牛的,我基本上就是使用他的这种方案,然后加入了自己的元素.这位大牛是通过Activity实现的,我稍作修改