此文章未轉載,供個人reference。
import android.graphics.Matrix; import android.graphics.PointF; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class MulitPointTouchListener implements OnTouchListener { Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); start.set(event.getX(), event.getY()); mode = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (mode == ZOOM) { float newDist = spacing(event); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; } view.setImageMatrix(matrix); return true; } private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } } imageView.setOnTouchListener(new MulitPointTouchListener ());在xml中要將圖片的縮放格式改成Matrix 注:android:scaleType="matrix" 注:此文檔爲轉載
前言 2015年,國務院提出了中國製造2025製造強國“三步走”規劃,旨在推動中國製造業成爲全球製造強國: 第一個十年規劃,2015-2025:中國製造業邁入製造強國行列,實現技術創新和產業升級。 第二個十年規劃,2025-2035:中國
概述 surging是一款開源的微服務引擎,包含了rpc服務治理,中間件,以及多種外部協議來解決各個行業的業務問題,在日益發展的今天,業務的需求也更加複雜,單一語言也未必能抗下所有,所以在多語言行業解決方案優勢情況下,那麼就需
from ftplib import FTP # 連接到FTP服務器 ftp = FTP('10.129.250.27') ftp.login(user='用戶名', passwd='密碼') # 列出FTP服務器上的文件和目錄 ft
本章介紹金融領域大模型智能體,並梳理金融LLM的相關資源。金融領域的大模型智能體當前集中在個股交易決策這個相對簡單的場景,不需要考慮多資產組合的複雜場景。交易決策被簡化成市場上各個信息,包括技術面,消息面,基本面等等在不同市場情況下,對資產
前言 現如今人工智能(AI)技術的發展可謂是如火如荼,它們在各個領域都展現出了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI和LLM相關的項目框架,希望能爲大家提供一些參考。如果你有更好的推薦,歡迎RP投稿或文末留言。 ht
作者:avengerEug 鏈接:https://juejin.cn/post/6984574787511123999 前言 經過前面對Spring AOP、事務的總結,我們已經對它們有了一個比較感性的認知了。 今天,我繼續安利一個獨門絕
做產品肯定要做電子郵件營銷,特別是面向海外的產品,電子郵件營銷已成爲企業與客戶溝通、建立品牌忠誠度和推動銷售的重要工具,可以直接接觸到目標受衆,提供個性化內容,並以相對較低的成本獲得可觀的投資回報。你看,MEAP 又來提醒我買電子書了!
前言 jquery時代更新視圖是直接對DOM進行操作,缺點是頻繁操作真實 DOM,性能差。react和vue時代引入了虛擬DOM,更新視圖是對新舊虛擬DOM樹進行一層層的遍歷比較,然後找出需要更新的DOM節點進行更新。這樣做的缺點就是如果D
之前碰到一個問題,需要處理一個超大型目錄,目錄有多大呢,有200G大小,大部分人的思路如下, 用日常的遞歸,基本上讀取到的路徑數組非常大,會導致超出內存,特此研究了一番: 一般常見的方法如下: function recursiveScan(
一、基礎 不依賴第三方軟件,對系統合理的設置來提高效率 休眠 注意不是睡眠,休眠後電源是斷開的,多用休眠方式去關機,這樣開機後還能保持所有的會話狀態,不用再去重新打開軟件 默認關機按鈕裏是沒有休眠選項的,需要到控制面板-電源裏去開啓
如何用費曼技巧快速學習任何東西 爲什麼教學是理解的關鍵 理查德·費曼是一位諾貝爾物理學獎得主,在量子力學、粒子物理等領域做出了重大貢獻。他還開創了量子計算,引入了納米技術的概念。他是康奈爾大學和加州理工學院的著名講師。 儘管取得了這些成就,
9大關於生產力的錯誤認知 以及你應該做的9個有用的替代方法 生產力 大量文章不斷提供新的方法來提高生產力,或者以新的方式重新包裝相同的建議。然而,無論我們讀了多少文章,我們大多數人仍然對自己的壞習慣感到無助。部分挑戰在於,養成提高生產力的習
如何高效使用 Todoist — 完整指南 無論你是在完成一個大型的團隊項目、策劃一個比預期工作量更大的活動,還是跟蹤你的賬單到期時間,你都有目標要實現。 但問題是,僅有目標還不夠。你需要一個系統來真正完成任務。 這就是 Todoist 的
在Spring中,CompletableFuture通常用於異步編程,可以方便地處理異步任務的執行和結果處理,CompletableFuture 是 Java 8 引入的一個類,用於支持異步編程和併發操作。它基於 Future 和 Comp
X-Frame-Options 是一個HTTP響應頭,用於控制網頁是否可以嵌套在 <frame>, <iframe>, <embed> 或者 <applet> 中。通過設置 X-Frame-Options 頭部,網站管理員可以防止網頁被嵌套