1. 程式人生 > >縮放系列(二):所有子控制元件也隨著縮放、手勢縮放、多點觸控layout

縮放系列(二):所有子控制元件也隨著縮放、手勢縮放、多點觸控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>

如果想要整個佈局能夠移動,可以看下面的帖子:

原始碼地址:https://github.com/Jszgw/ScaleLayout2

相關推薦

系列所有控制元件隨著手勢觸控layout

下面是一個功能強大的改造的例子: 可以實現以下需求: 1.兩個手指進行縮放佈局 2.所有子控制元件也隨著縮放, 3.子控制元件該有的功能不能丟失(像button有可被點選的功能,縮放後不能丟失該功能) 執行效果圖: java程式碼如下 MainActi

ASP.NET AJAX入門系列5使用UpdatePanel控制元件

{            if (String.IsNullOrEmpty(FirstNameTextBox.Text) ||               String.IsNullOrEmpty(LastNameTextBox.Text)) { return; }             int emplo

系列一個可以手勢拖拽旋轉的layout

弄了一個下午,終於搞出來了,PowerfulLayout 下面是一個功能強大的改造的例子: 可以實現以下需求: 1.兩個手指進行縮放佈局 2.所有子控制元件也隨著縮放, 3.子控制元件該有的功能不能丟失(像button有可被點選的功能,縮放後不能丟失該功能)

容器開啟數據服務之旅系列Kubernetes如何助力Spark大數據分析

容器 控制臺 摘要: 容器開啟數據服務之旅系列(二):Kubernetes如何助力Spark大數據分析 (二):Kubernetes如何助力Spark大數據分析 概述 本文為大家介紹一種容器化的數據服務Spark + OSS on ACK,允許Spark分布式計算節點對阿裏雲OSS對象存儲的直接訪問。

JavaScript夯實基礎系列閉包

情況 全局環境 賦值 命名 因此 沒有 部分 .com 查詢 ??在JavaScript中函數是一等公民。所謂一等公民是指函數跟其他對象一樣,很普通,可以進行把函數存在數組中、作為參數傳遞、賦值給變量等操作。當函數作為另一個函數的返回值在外部調用時,跟該函數在函數內部調用時

ELK系列.net core中使用ELK

正常 etc () 完成後 class -c tro 訪問 ret ELK安裝好後,我們現在.net Core中使用一下,大體思路就是結合NLog日誌組件將數據寫入ELK中,其它語言同理。 ELK的安裝還是有些復雜的,我們也可以在Docker中安裝ELK:docker ru

eShopOnContainers學習系列數據庫連接健康檢查

技術分享 負載 star bsp 方法 containe 需要 正常 連接 項目裏使用數據庫的時候,我們有時候需要知道數據庫當前的健康狀態,特別是當數據庫連接不上的時候能夠立馬獲悉。eShopOnContainers裏存在著大量的服務健康、連接健康的檢查,數據庫連接是其中之

linux系列cd命令

1、命令格式:   cd [目錄名] 2、命令功能:   切換當前目錄至目錄名目錄 3、常用例項 (1)、進入系統根目錄 命令:   cd / 輸出: [email protected]:~/軟體$ cd / [email protected]-computer:/

Windows Service 學習系列C# windows服務安裝解除安裝啟動和停止Windows Service

一、通過CMD安裝、解除安裝、啟動、停止Windows Service     方法一   1.以管理員身份執行cmd   2.安裝windows服務       切換cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(InstallUtil.e

faster rcnn pytorch 復現系列generate_anchors原始碼解析

目錄​ 1. 總函式 generate_anchors 2. 函式分功能寫,首先是ratios的實現,其次是scale的實現 3. anchor2WHXY函式+WsHsXsYs2anchors函式[s表示複數] 4.  _ratio_enum(anchor,r

Fragment全解析系列正確的使用姿勢

Fragment是可以讓你的app縱享絲滑的設計,如果你的app想在現在基礎上效能大幅度提高,並且佔用記憶體降低,同樣的介面Activity佔用記憶體比Fragment要多,響應速度Fragment比Activty在中低端手機上快了很多,甚至能達到好幾倍!如果你的app當前或以後有移植平板等平臺時,

詳解SVM系列拉格朗日對偶性

拉格朗日函式有什麼用? 在約束最優化問題中,常常利用拉格朗日對偶性將原始問題轉換為對偶問題,通過解對偶問題而得到原始問題的解。 原始問題: 假設 f (

Docker系列通過Docker安裝使用 Kubernetes K8s

Docker社群版從17.12版本開始已經提供了對Kubernetes的支援。但是由於其安裝過程依賴的映象服務在國內訪問很不穩定,很多朋友都無法配置成功。我們提供了一個簡單的工具幫助大家開啟Docker社群版的Kubernetes功能。 我們需要先安裝好Docker CE的最新版,18.03 - 18.09

redis系列資料操作

1、string型別 字串型別是Redis中最為基礎的資料儲存型別,它在Redis中是二進位制安全的,這便意味著該型別可以接受任何格式的資料,如JPEG影象資料或Json物件描述資訊等。在Redis中字串型別的Value最多可以容納的資料長度是512M。 (1)、儲存 如果設定的鍵不存在則新增,如果已存

STM32開發筆記48STM32F4+DP83848乙太網通訊指南系列系統時鐘

本章為系列指南第二章,主要是介紹一下STM32F4的時鐘配置。時鐘是一個嵌入式產品從零開始開發的基石,一切邏輯都在時鐘的節奏中安靜地彈奏著,時鐘為整個電路帶來了歡快的「心跳」。開發者如果對時鐘沒有控制能力,就會把脈不準整個旋律的節奏,從而導致諸如通訊波特率、通訊時序、延時操作等關鍵功能全都紊亂,系統

Web安全系列XSS 攻擊進階初探 XSS Payload

什麼是 XSS Payload 上一章我談到了 XSS 攻擊的幾種分類以及形成的攻擊的原理,並舉了一些淺顯的例子,接下來,我就闡述什麼叫做 XSS Payload 以及從攻擊者的角度來初探 XSS 攻擊的威力。 在黑客 XSS 攻擊成功之後,攻擊者能夠對使用者當前瀏覽的頁面植入各種惡意指令碼,通過惡意指令碼來

image caption解讀系列《Knowing When to Look: Adaptive Attention via A Visual Sentinel for Image Capt》

本文主要是在這篇部落格的基礎上結合程式碼進行分析。 文章依然採用了encoder-decoder的框架。作者認為decoder的時候非視覺詞多依賴的是語義資訊而不是視覺資訊。而且,在生成caption的過程中,非視覺詞的梯度會誤導或者降低視覺資訊的有效性。因此,本文提出

爬蟲入門系列優雅的HTTP庫requests

爬蟲入門系列目錄: urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相關的 Python 模組,看名字就覺得很反人類,更糟糕的是這些模組在 Python2 與 Python3 中有很大的差異,如果業務程式碼要同時相容 2 和 3,寫起來

keras系列模型設定

Keras模型簡介 Keras的初始構建塊是一個模型,最簡單的模型稱為序列。Keras序列模型是一個神經網路層的線性管道(一個堆疊)。 from keras.models import Sequential model = Sequential() model.

image caption解讀系列《Show, Attend and Tell_Neural Image Caption》

一、相關工作 二、 基本思想       文章在NIC的基礎上加入了attention機制 三、模型結構 對LSTM部分做出的改動,其餘與NIC相同。       四、程式碼分析        (0)預處理       首先是把資料中長度大於2