在这个例子里面我实现了多个view在切换时同时支持手势和点击底部的button,纯UI的东西,除了设计模式,没有什么原理可讲,上代码。
1.MainActivity.java:
package com.isomobile.widgets;
import android.app.ActivityGroup;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends ActivityGroup implements View.OnClickListener {
private int mCurId = R.id.btn1;
private MainViewManager mViewManager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mViewManager = MainViewManager.getInstance();
mViewManager.setupViews(this);
}
@Override
public void onClick(View v) {
final int id = v.getId();
if (mCurId == id) {
return;
}
mCurId = id;
mViewManager.setCurBtnPos(id);
mViewManager.processViews(this);
mViewManager.onRotateAnimation(mViewManager.getCurBtnIndex(id));
}
}
2.MainViewManager.java
package com.isomobile.widgets;
import android.app.Activity;
import android.app.ActivityGroup;
import android.content.Context;
import android.content.Intent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.RelativeLayout;
public class MainViewManager {
private static final int FLING_MIN_DISTANCE = 120;
private static final int FLING_MIN_VELOCITY = 200;
private final static int DISTENCE_X = 240, DISTENCE_Y = 0;
private final static int ROTATE_ANIMATION_DURATION = 300;
private final static int DEFAULT_FLING_ANGLE = 30;
public final static Class<?>[] sActivityClasses = new Class[]{
Activity1.class, Activity2.class, Activity3.class, Activity4.class, Activity5.class
};
public final static int[] sResIds = new int[]{
R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5
};
public final static String[] sActivityIds = new String[]{
"Activity1", "Activity2", "Activity3", "Activity4", "Activity5"
};
private int mPreBtnPos = 0, mCurBtnPos = 0;
private RelativeLayout mViewContainer;
private View mPreView;
private View[] mCurView = new View[sResIds.length];
private Button[] mBtns = new Button[sResIds.length];
private static MainViewManager mInstance = new MainViewManager();
private MainViewManager() {
}
public static MainViewManager getInstance() {
return mInstance;
}
public int getCurBtnId(int index) {
return sResIds[index];
}
public void setCurBtnPos(int rid) {
mCurBtnPos = getCurBtnIndex(rid);
}
public View getCurView(int index) {
return mCurView[index];
}
public void setupViews(Context context) {
mViewContainer = (RelativeLayout) ((Activity) context).findViewById(R.id.container);
final Button[] btns = mBtns;
for (int i = 0; i < btns.length; i++) {
btns[i] = (Button) ((Activity) context).findViewById(sResIds[i]);
btns[i].setOnClickListener((OnClickListener) context);
}
// 第一次启动时,默认跳转到第一个activity
mCurView[0] = ((ActivityGroup) context).getLocalActivityManager().startActivity(
sActivityIds[0],
new Intent(context, sActivityClasses[0]).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
.getDecorView();
mViewContainer.addView(mCurView[0]);
mPreView = mCurView[0];
mPreBtnPos = 0;
}
public int getCurBtnIndex(int rid) {
final int length = sResIds.length;
for (int i = 0; i < length; i++) {
if (rid == sResIds[i]) {
return i;
}
}
return 0;
}
public int getCurBtnResid(){
return sResIds[mCurBtnPos];
}
public boolean getMotionState(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){
return e1.getX() - e2.getX() > FLING_MIN_DISTANCE
&& Math.abs(velocityX) > FLING_MIN_VELOCITY
&& Math.abs(Math.toDegrees(Math.atan((e1.getY() - e2.getY())
/ (e1.getX() - e2.getX())))) < DEFAULT_FLING_ANGLE;
}
public void processViews(Context context) {
mViewContainer.removeAllViews();
final Intent intent = new Intent(context, sActivityClasses[mCurBtnPos]);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mCurView[mCurBtnPos] = ((ActivityGroup) context).getLocalActivityManager().startActivity(
sActivityIds[mCurBtnPos], intent).getDecorView();
}
public void onRotateAnimation(int index) {
if (mPreBtnPos > mCurBtnPos) {
Rotate3d.rightRotate(mPreView, mCurView[index], DISTENCE_X, DISTENCE_Y,
ROTATE_ANIMATION_DURATION, new AnimListener());
} else {
Rotate3d.leftRotate(mPreView, mCurView[index], DISTENCE_X, DISTENCE_Y,
ROTATE_ANIMATION_DURATION, new AnimListener());
}
mPreView = mCurView[index];
mViewContainer.removeAllViews();
mViewContainer.addView(mCurView[index]);
mPreBtnPos = mCurBtnPos;
}
private final static class AnimListener implements Animation.AnimationListener {
public void onAnimationEnd(Animation animation) {
// 可以设置buttons的背景或者状态(是否可点击等)
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
// 可以设置buttons的背景或者状态(是否可点击等)
}
}
}
3.Activity1~Activity5.java:
package com.isomobile.widgets;
import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.LinearLayout;
import android.widget.TextView;
public class Activity1 extends Activity implements OnTouchListener, OnGestureListener {
private GestureDetector mGestureDetector;
private MainViewManager mViewManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1_layout);
setupViews();
}
private void setupViews() {
mGestureDetector = new GestureDetector(this);
mViewManager = MainViewManager.getInstance();
android.util.Log.d("TAG", "aaa");
final LinearLayout layout1 = (LinearLayout) findViewById(R.id.layout1);
final TextView tv1 = (TextView) layout1.findViewById(R.id.tv1);
tv1.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
android.util.Log.d("TAG", "1111");
mGestureDetector.onTouchEvent(event);
return true;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (mViewManager.getMotionState(e1, e2, velocityX, velocityY)) {
mViewManager.setCurBtnPos( mViewManager.getCurBtnId(1));
if (null == mViewManager.getCurView(1)) {
mViewManager.processViews(getParent());
}
mViewManager.onRotateAnimation(1);
return true;
} else if (mViewManager.getMotionState(e2, e1, velocityX, velocityY)) {
mViewManager.setCurBtnPos( mViewManager.getCurBtnId(4));
if (null == mViewManager.getCurView(4)) {
mViewManager.processViews(getParent());
}
mViewManager.onRotateAnimation(4);
return true;
}
} catch (Exception ex) {
return true;
}
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;
}
}
整个工程源代码:http://download.csdn.net/detail/androidzhaoxiaogang/3643473
分享到:
相关推荐
button在底部的多个view切换 实例一正常切换.~~
button在底部的多个view切换 实例二3D切换~~~~~~~~~~~~~~~~~~
1.将View的操作借助一个单实例的MainViewmanager分离开来; 2.实现真正意义上的MVC; 3.继续使用原来的索引也即表驱动的方式来管理view的添加和删除等;
代码精简,结构清晰,使用了include标签,希望对大家有帮助;另外实现了3D旋转动画。
代码精简,结构清晰,使用了include标签,希望对大家有帮助。
305<br>实例216 注册系统热键 306<br>实例217 获取和修改BIOS计算机名 307<br>7.8 鼠标操作 308<br>实例218 动画鼠标 309<br>实例219 限制鼠标活动区域 310<br>实例220 获取鼠标在任意点的位置 311<br>...
基本示例:<button>点击这里</button> </div> <div class="demo_2"> 提示成功:<button>点击这里</button> </div> <div class="demo_3"> 提示失败:<button>点击这里</button> </div> <div class="demo_...
本文实例为大家分享了javascript实现点击按钮切换图片的具体代码,供大家参考,具体内容如下 首先搭建基本的结构 <div id="div"> <p id="desc"></p> <!--默认显示第一张图片--> <img src="img/1.jpg" alt="加载...
<button onclick="InitFrame()">初始化插件</button><br /> <button onclick="OnNew()">新建文档</button><br /> <button onclick="SaveAsLocal()">保存到本地</button><br /> <button onclick="Open()...
<head> <meta charset="UTF-8"> <...meta name="viewport" content="width=device-width, initial-scale=1.0">... js css3实现的多个图片3D旋转轮播特效,很好看的网站焦点图立体旋转切换代码。
72<br><br>0102 将字符串首字母转换大写 72<br><br>0103 如何进行字节数组和字符串的相互转换 72<br><br>0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73<br><br>4.2 获取字符串信息 73<br>...
<br> <br><br>公共构造函数<br><br> public Button()<br> 摘要:<br> 初始化 Button 类的新实例。 <br><br>公共属性<br><br> Style { set; get; } <br> 摘要:<br> 获取或设置控件的样式 <br><br>受保护的方法...
<!DOCTYPE ... <div><button onclick="jixu()">继续</button></div> </div> </div> </div> <script type="text/javascript" src="../js/main.js"></script> </body> </html>
<view slot="header"> <header-navbar title="个人信息"></header-navbar> </view> <!-- 关键代码 start --> <view slot="scroll" class="content"> <view class="row"> <view class="text1">头像:</view> ...
jQuery搜索框实例绑定提交事件是一款下拉选择多种搜索引擎分类,搜索框输入文字键盘回车绑定提交搜索按钮代码。 <div class="input-group-btn"> <button type="button" class="btn btn-link dropdown-...
<div id="level"><span>Level:</span><span class="level">1</span></div> <div id="score"><span>Score:</span><span class="score">0</span></div> <button id="pause">暂停</button> <p>控制:</p> <p>← 向...
<li class="focalPoint"><a >•</a></li><li><a >•</a></li><li><a >•</a></li><li><a >•</a></li> </ul> <button class="sldr-prv sldr-nav prev">Prev</button> <button class="sldr-nxt sldr-nav next">...
57<br>2.2 Button控件应用 58<br>实例053 在Button按钮中显示图标 58<br>2.3 ComboBox控件应用 59<br>实例054 将数据表中的字段添加到ComboBox控件 59<br>实例055 带查询功能的ComboBox控件 61<br>2.4 ...
<view class="body" > <view class="libox"> <view class="lidtbox"> <image src="/images/manyi1.jpg"/> </view> <view class="liddbox" bindtap="addcart" id="1"> <text class="h2...