当前位置: 首页 > news >正文

缩放系列(二):所有子控件也随着缩放、手势缩放、多点触控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

转载于:https://www.cnblogs.com/johnsonwei/p/5830277.html

相关文章:

  • [20160902]rm -rf的惨案.txt
  • Xposed模块的开发
  • 使用 @font-face
  • 格式与布局定位
  • 一步步来配置安卓开发环境ADTBundle
  • 基础知识整理-1
  • JavaScript之apply()和call()的区别
  • javascript 常用技巧
  • 自定义Spark Partitioner提升es-hadoop Bulk效率
  • 权限及权限管理
  • activemq安全设置 设置admin的用户名和密码
  • 全局CSS设置
  • 1分钟导出MySQL的数据字典
  • 1060. 爱丁顿数(25)
  • struts理解
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Go 语言编译器的 //go: 详解
  • httpie使用详解
  • HTTP--网络协议分层,http历史(二)
  • Octave 入门
  • PAT A1050
  • Python - 闭包Closure
  • python3 使用 asyncio 代替线程
  • Python实现BT种子转化为磁力链接【实战】
  • Vue2.0 实现互斥
  • 分享几个不错的工具
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 批量截取pdf文件
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深度学习入门:10门免费线上课程推荐
  • 使用 Docker 部署 Spring Boot项目
  • 使用agvtool更改app version/build
  • 我看到的前端
  • UI设计初学者应该如何入门?
  • 阿里云API、SDK和CLI应用实践方案
  • (TOJ2804)Even? Odd?
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (译)计算距离、方位和更多经纬度之间的点
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)http-server应用
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .bat批处理出现中文乱码的情况
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 使用 XPath 来读写 XML 文件
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • ??在JSP中,java和JavaScript如何交互?
  • @EnableWebMvc介绍和使用详细demo
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法