ViewFlipper(翻转视图)的基本使用
2016-06-17 21:16
281 查看
ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放!
和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候, 用来实现进入应用后的引导页,或者用于图片轮播,本节我们就使用ViewFlipper写一个简单的图片
轮播的例子
首次接触一个对象,不了解怎么处?ctrt+T (AS : ctrl+H)一把 继承关系
ViewFlipper extends ViewAnimator
ViewAnimator extends FrameLayout
直接上代码:
package com.xiangsc.fzstdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.ViewFlipper;
public class MainActivity extends Activity {
private ViewFlipper v;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
v=new ViewFlipper(getApplication());
int icons[]={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e};
for(int i=0;i<icons.length;i++){
ImageView iv=new ImageView(getApplication());
iv.setImageResource(icons[i]);
v.addView(iv, i);
}
v.startFlipping();//查看源代码默认3000时间
setContentView(v);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int startX = 0;
int endX = 0;
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
endX=(int) event.getX();
startX=endX;
break;
case MotionEvent.ACTION_DOWN:
startX=(int) event.getX();
break;
case MotionEvent.ACTION_UP:
if(startX-endX>0){
v.showPrevious();
}
else{
v.showNext();
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
}
v.startFlipping();//查看源代码默认3000时间
查源码可以看到原理轮播原理:
追一下源码:
public
void startFlipping() {
mStarted = true;
updateRunning();
}
private
void updateRunning() {
updateRunning(true);
}
//终于追到
private
void updateRunning(boolean flipNow) {
boolean running = mVisible && mStarted && mUserPresent;
if (running != mRunning) {
if (running) {
showOnly(mWhichChild, flipNow);
Message msg = mHandler.obtainMessage(FLIP_MSG);
mHandler.sendMessageDelayed(msg, mFlipInterval);
} else {
mHandler.removeMessages(FLIP_MSG);
}
mRunning = running;
}
if (LOGD) {
Log.d(TAG, "updateRunning() mVisible=" + mVisible + ", mStarted=" + mStarted
+ ", mUserPresent=" + mUserPresent + ", mRunning=" + mRunning);
}
}
private static final int DEFAULT_INTERVAL = 3000;
//查看源代码默认3000时间 是吧 菜鸟我没逗你玩吧!!!!!
private int mFlipInterval = DEFAULT_INTERVAL;
和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候, 用来实现进入应用后的引导页,或者用于图片轮播,本节我们就使用ViewFlipper写一个简单的图片
轮播的例子
首次接触一个对象,不了解怎么处?ctrt+T (AS : ctrl+H)一把 继承关系
ViewFlipper extends ViewAnimator
ViewAnimator extends FrameLayout
直接上代码:
package com.xiangsc.fzstdemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.ViewFlipper;
public class MainActivity extends Activity {
private ViewFlipper v;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
v=new ViewFlipper(getApplication());
int icons[]={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e};
for(int i=0;i<icons.length;i++){
ImageView iv=new ImageView(getApplication());
iv.setImageResource(icons[i]);
v.addView(iv, i);
}
v.startFlipping();//查看源代码默认3000时间
setContentView(v);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int startX = 0;
int endX = 0;
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
endX=(int) event.getX();
startX=endX;
break;
case MotionEvent.ACTION_DOWN:
startX=(int) event.getX();
break;
case MotionEvent.ACTION_UP:
if(startX-endX>0){
v.showPrevious();
}
else{
v.showNext();
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
}
v.startFlipping();//查看源代码默认3000时间
查源码可以看到原理轮播原理:
追一下源码:
public
void startFlipping() {
mStarted = true;
updateRunning();
}
private
void updateRunning() {
updateRunning(true);
}
//终于追到
private
void updateRunning(boolean flipNow) {
boolean running = mVisible && mStarted && mUserPresent;
if (running != mRunning) {
if (running) {
showOnly(mWhichChild, flipNow);
Message msg = mHandler.obtainMessage(FLIP_MSG);
mHandler.sendMessageDelayed(msg, mFlipInterval);
} else {
mHandler.removeMessages(FLIP_MSG);
}
mRunning = running;
}
if (LOGD) {
Log.d(TAG, "updateRunning() mVisible=" + mVisible + ", mStarted=" + mStarted
+ ", mUserPresent=" + mUserPresent + ", mRunning=" + mRunning);
}
}
private static final int DEFAULT_INTERVAL = 3000;
//查看源代码默认3000时间 是吧 菜鸟我没逗你玩吧!!!!!
private int mFlipInterval = DEFAULT_INTERVAL;
相关文章推荐
- 【Unity Shaders】学习笔记——Shader和渲染管线
- Kinect的三维重建
- 数组中出现次数超过一半的数
- android Studio 的ADB使用配置
- 闭包
- java学习笔记之自定义注解
- Java多线程——安全与死锁问题
- latex 不换行
- cs231学习笔记一 图像识别与KNN
- MIPI CSI-2规范(一)——概述及层级
- PYTHON-基础-时间日期处理小结
- Android中获取布局中的布局(获取子布局方法)
- 周末作业
- C++ - PAT - 1047. 编程团体赛(20)
- 机器学习(周志华版)读书笔记1
- 300 Longest Increasing Subsequence
- 补C++ 4
- linux---谈谈vfork和fork的区别及exit与return
- 专题四1005
- hdu 1021 Fibonacci Again(斐波那契数列,取余)