`
nanjingjiangbiao_T
  • 浏览: 2596697 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

button在底部的多个view切换<实例三触摸和点击实现3D切换>

 
阅读更多

在这个例子里面我实现了多个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

分享到:
评论

相关推荐

    android button在底部的多个view切换 实例一正常切换.

    button在底部的多个view切换 实例一正常切换.~~

    android button在底部的多个view切换 实例二3D切换

    button在底部的多个view切换 实例二3D切换~~~~~~~~~~~~~~~~~~

    button在底部的多个view切换优化之<实例二3D切换>

    1.将View的操作借助一个单实例的MainViewmanager分离开来; 2.实现真正意义上的MVC; 3.继续使用原来的索引也即表驱动的方式来管理view的添加和删除等;

    多个button互相切换view<实例二3D切换>

    代码精简,结构清晰,使用了include标签,希望对大家有帮助;另外实现了3D旋转动画。

    多个button互相切换view<实例一>

    代码精简,结构清晰,使用了include标签,希望对大家有帮助。

    C#.net_经典编程例子400个

    305&lt;br&gt;实例216 注册系统热键 306&lt;br&gt;实例217 获取和修改BIOS计算机名 307&lt;br&gt;7.8 鼠标操作 308&lt;br&gt;实例218 动画鼠标 309&lt;br&gt;实例219 限制鼠标活动区域 310&lt;br&gt;实例220 获取鼠标在任意点的位置 311&lt;br&gt;...

    弹出层提示

    基本示例:&lt;button&gt;点击这里&lt;/button&gt; &lt;/div&gt; &lt;div class="demo_2"&gt; 提示成功:&lt;button&gt;点击这里&lt;/button&gt; &lt;/div&gt; &lt;div class="demo_3"&gt; 提示失败:&lt;button&gt;点击这里&lt;/button&gt; &lt;/div&gt; &lt;div class="demo_...

    javascript实现点击按钮切换图片

    本文实例为大家分享了javascript实现点击按钮切换图片的具体代码,供大家参考,具体内容如下 首先搭建基本的结构 &lt;div id="div"&gt; &lt;p id="desc"&gt;&lt;/p&gt; &lt;!--默认显示第一张图片--&gt; &lt;img src="img/1.jpg" alt="加载...

    金山WPS宏文件

    &lt;button onclick="InitFrame()"&gt;初始化插件&lt;/button&gt;&lt;br /&gt; &lt;button onclick="OnNew()"&gt;新建文档&lt;/button&gt;&lt;br /&gt; &lt;button onclick="SaveAsLocal()"&gt;保存到本地&lt;/button&gt;&lt;br /&gt; &lt;button onclick="Open()...

    CSS3图片3D旋转轮播特效.zip

    &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;...meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;... js css3实现的多个图片3D旋转轮播特效,很好看的网站焦点图立体旋转切换代码。

    C#编程经验技巧宝典

    72&lt;br&gt;&lt;br&gt;0102 将字符串首字母转换大写 72&lt;br&gt;&lt;br&gt;0103 如何进行字节数组和字符串的相互转换 72&lt;br&gt;&lt;br&gt;0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73&lt;br&gt;&lt;br&gt;4.2 获取字符串信息 73&lt;br&gt;...

    换肤button

    &lt;br&gt; &lt;br&gt;&lt;br&gt;公共构造函数&lt;br&gt;&lt;br&gt; public Button()&lt;br&gt; 摘要:&lt;br&gt; 初始化 Button 类的新实例。 &lt;br&gt;&lt;br&gt;公共属性&lt;br&gt;&lt;br&gt; Style { set; get; } &lt;br&gt; 摘要:&lt;br&gt; 获取或设置控件的样式 &lt;br&gt;&lt;br&gt;受保护的方法...

    微信飞机大战

    &lt;!DOCTYPE ... &lt;div&gt;&lt;button onclick="jixu()"&gt;继续&lt;/button&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;script type="text/javascript" src="../js/main.js"&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt;

    小程序如何获取用户名和头像-常用的2种方法,供大家学习研究参考~

    &lt;view slot="header"&gt; &lt;header-navbar title="个人信息"&gt;&lt;/header-navbar&gt; &lt;/view&gt; &lt;!-- 关键代码 start --&gt; &lt;view slot="scroll" class="content"&gt; &lt;view class="row"&gt; &lt;view class="text1"&gt;头像:&lt;/view&gt; ...

    jQuery搜索框实例绑定提交事件.zip

    jQuery搜索框实例绑定提交事件是一款下拉选择多种搜索引擎分类,搜索框输入文字键盘回车绑定提交搜索按钮代码。 &lt;div class="input-group-btn"&gt;  &lt;button type="button" class="btn btn-link  dropdown-...

    jQuery网页版俄罗斯方块游戏代码.zip

    &lt;div id="level"&gt;&lt;span&gt;Level:&lt;/span&gt;&lt;span class="level"&gt;1&lt;/span&gt;&lt;/div&gt; &lt;div id="score"&gt;&lt;span&gt;Score:&lt;/span&gt;&lt;span class="score"&gt;0&lt;/span&gt;&lt;/div&gt; &lt;button id="pause"&gt;暂停&lt;/button&gt; &lt;p&gt;控制:&lt;/p&gt; &lt;p&gt;← 向...

    jQuery兼容手机端的响应式倾斜图片幻灯片插件.zip

    &lt;li class="focalPoint"&gt;&lt;a &gt;•&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a &gt;•&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a &gt;•&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a &gt;•&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;button class="sldr-prv sldr-nav prev"&gt;Prev&lt;/button&gt; &lt;button class="sldr-nxt sldr-nav next"&gt;...

    C#程序开发范例宝典2

    57&lt;br&gt;2.2 Button控件应用 58&lt;br&gt;实例053 在Button按钮中显示图标 58&lt;br&gt;2.3 ComboBox控件应用 59&lt;br&gt;实例054 将数据表中的字段添加到ComboBox控件 59&lt;br&gt;实例055 带查询功能的ComboBox控件 61&lt;br&gt;2.4 ...

    微信小程序 购物车UI

    &lt;view class="body" &gt; &lt;view class="libox"&gt; &lt;view class="lidtbox"&gt; &lt;image src="/images/manyi1.jpg"/&gt; &lt;/view&gt; &lt;view class="liddbox" bindtap="addcart" id="1"&gt; &lt;text class="h2...

Global site tag (gtag.js) - Google Analytics