zoukankan      html  css  js  c++  java
  • 缩放系列(二):所有子控件也随着缩放、手势缩放、多点触控layout

    下面是一个功能强大的改造的例子:

    可以实现以下需求:

    1.两个手指进行缩放布局

    2.所有子控件也随着缩放,

    3.子控件该有的功能不能丢失(像button有可被点击的功能,缩放后不能丢失该功能)

     运行效果图:

    java代码如下

    MainActivity.java:

    public class MainActivity extends ActionBarActivity {
        private ScaleGestureDetector mScaleGestureDetector = null;
        private View view;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // setContentView(R.layout.test);
            view = View.inflate(this, R.layout.activity_main, null);
            setContentView(view);
            
            mScaleGestureDetector = new ScaleGestureDetector(this,
                    new ScaleGestureListener());
    
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // 返回给ScaleGestureDetector来处理
            return mScaleGestureDetector.onTouchEvent(event);
        }
    
        public class ScaleGestureListener implements
                ScaleGestureDetector.OnScaleGestureListener {
    
            private float scale;
            private float preScale = 1;// 默认前一次缩放比例为1
    
            @Override
            public boolean onScale(ScaleGestureDetector detector) {
    
                float previousSpan = detector.getPreviousSpan();
                float currentSpan = detector.getCurrentSpan();
                if (currentSpan < previousSpan) {
                    // 缩小
                    // scale = preScale-detector.getScaleFactor()/3;
                    scale = preScale - (previousSpan - currentSpan) / 1000;
                } else {
                    // 放大
                    // scale = preScale+detector.getScaleFactor()/3;
                    scale = preScale + (currentSpan - previousSpan) / 1000;
                }
    
                // 缩放view
                ViewHelper.setScaleX(view, scale );// x方向上缩小
                ViewHelper.setScaleY(view, scale );// y方向上缩小
    
                return false;
            }
    
            @Override
            public boolean onScaleBegin(ScaleGestureDetector detector) {
                // 一定要返回true才会进入onScale()这个函数
                return true;
            }
    
            @Override
            public void onScaleEnd(ScaleGestureDetector detector) {
                preScale = scale;//记录本次缩放比例
            }
        }
    }

    布局文件(activity_main.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:orientation="vertical" 
        android:background="@drawable/home_tools"
        >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="测试" />
    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/abc_ic_voice_search_api_holo_light" />
    
        <ImageButton
            android:id="@+id/imageButton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/selector_button2" />
    
        <ImageButton
            android:id="@+id/imageButton2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/selector_button1" 
            android:layout_gravity="center"
            />
    
    </LinearLayout>

     selector_button1.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:drawable="@drawable/home_tools" android:state_pressed="true"></item>
        <item android:drawable="@drawable/home_trojan"></item>
    </selector>

    selector_button2.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:drawable="@drawable/home_sysoptimize" android:state_pressed="true"></item>
        <item android:drawable="@drawable/home_taskmanager"></item>
    </selector>

      

    如果想要整个布局能够移动,可以看下面的帖子:

     http://www.cnblogs.com/johnsonwei/p/5831925.html

  • 相关阅读:
    ASP.NET 2.0 用户注册控件的密码验证问题
    编程使用GridView,DataList的模版列
    在您的站点上添加 Windows Live Favourites 收藏入口
    推荐个很好玩的开源项目Ascii Generator dotNET
    Castle ActiveRecord 在Web项目和WinForm项目中
    HTML解析器项目进展和新的构思
    SilverLight 的跨域跨域访问
    SQL 语句之Join复习
    【笔记】提高中文分词准确性和效率的方法
    ASP.NET 动态加载控件激发事件的问题
  • 原文地址:https://www.cnblogs.com/johnsonwei/p/5830277.html
Copyright © 2011-2022 走看看