Androidはマルチタッチでimageviewの大きさをスケールし、ジェスチャーでスライドしてview位置を移動する思考

2927 ワード

最近、会社はジェスチャースライドをしてviewの効果を拡大縮小しようとしていますが、これまでこの方面の知識に出会ったことがないので、ネットで調べてみました.
この効果には2つの問題があります:①マルチタッチ.②ズーム後の位置の配置について
1つ目の問題は、最初の指がスクリーンに触れるとdownイベントがトリガーされ、2番目の指、3番目の指がトリガーされます.のタッチスクリーンはpointer_をトリガーしますdownイベント、スライド時にmoveイベントがトリガーされ、moveイベントでevent.getx(int pointindex)は,index番目の点の自己に対する距離を取得し,2次距離の大きさを比較することで拡大するか縮小するかを判断するが,この点に関する資料はネット上に多く,ここでは煩わしくない.
2つ目の質問はまずimageviweのスケールと似ていると思います.資料を調べることでiamgeviewのスケールについて、2つあります.1つ目はimageviweを継承してマトリクス変換で実現し、私の状況に合わないと感じます.2つ目はViewを継承しondraw(canvas)でcanvas.drawBitmap(bitmap   Rect Rect Paint);に表示されます.
http://www.cnblogs.com/_ymw/p/4156577.htmlこの文章を参照して最終的に実現する.
この文章の中で、最も主要なのはzoomimageviewというクラスで、このクラスの中で多くのObserableとObserverオブジェクトを使用して、これは観察者モードを使用して、私たちの重点とは関係なく、(このプログラミングモードは私たちが学ぶ価値があって、もっと便利な再構築コードで、欠点はコードのジャンプ性の強化です).
コード中AspectQuotient(見どころ商??)このクラスの意味はわかりませんが、私たちのコンテンツのアスペクト比は親コントロールのアスペクト比と同じですので、私たちの実装には影響しません.
ZoomStateはコアクラスで、その中のZoomはスケールの割合、mPanX、mPanYはスペースセンター左の内容が全内容に占める割合(この意味を理解するために1日かけて、言いすぎても涙ですね)なのか、まだ分かりませんか?下図を見る

mPanXの意味はx 0/x 1である(もちろん相対点の選択は勝手で、このブログはコントロールの中心に対して、私はコントロールの左境界に対して実現している).mPanYは現在最も主要なmPanXの計算問題に類似しており、ここでは2つの場合がある.1:スライドの場合:コントロール上でdxの距離をスライドすると、内容が拡大した場合にもdxがスライドするので、mPanX=mPanX±dx/(zoom*contentWidth)であり、その中でzoomは拡大縮小の倍数であり、contentWidthは内容の元の大きさである.(BasicZoomListener,BasicZoomControlクラスのpan(dx,dy)メソッドを参照)②:スケーリングを実現するのはmPanXのサイズ変化であり、スケーリング中心が選択する相対点である場合(ここではコントロールの中点である)、mPanxのサイズは変化しないことが分かる.しかし、私たちのスケール中心が任意の点である場合?我々のズーム中心が画面の1/4である場合、ズーム前には、1/4点のmPanx値がmPanx-(1/2-1/4)/zoom 1であることが分かる、ズーム後1/4点のmPanX値もmPanx-(1/2-1/4)/zoom 1であり、このとき中心のmPanX値はmPanx-(1/2-1/4)/zoom 1+(1/2-1/4)/zoom 2(zoom 1はズーム前のズーム倍数、zoom 2はズーム後のズーム倍数)である.このようにスケーリング後の中心点のmPanX値を出しても,半分に広げた場合はmPanX=mPanX-(0.5-x)((1/zoom 1)-(1/zoom 2))(BasicZoomControl類におけるzoom(float,float,float)法を参照)であり,より一般的な場合はmPanX=mPanX-(center-x)(-(1/zoom 1)-(1/zoom 2)),centerは選択した相対点,xはスケーリング中心,mPanYの場合と類似している.今、zoomとmPanX、mPanYの値を知っています.ズーム後の画像の一部を簡単にコントロールに表示することができます.left=mPanX*zoom*contentWidth-contentWidth/2;right=left+contentWidth;
 
  
 
  
 
  


今日使用中にマルチタッチ時のバグが発生しましたので、ここで補足します.
上の文章で最後の点を得たxとyの位置の書き方はfloat x=eventである.get(event.getpointerId(count-1));この言い方は間違っている.
参照:http://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch
Example:
Touch 1 Down.
Touch 1 State Index=0. ID=0Touch 1 State Index=0. ID=0Touch 2 State Index=1. ID=1Touch 2 State Index=0. ID=1
Touch 2 Down.
Touch 1 Release.
3回目の状態の時点で.event.getpointerId(count-1)で得られた数値は1であるがevent.get(index)から伝達される数値はindexであり,このとき2番目の点idは1,indexは0である.event.get(1)はjavaを間違えます.lang.IllegalArgumentException: pointerIndex out of range.
解決方法はここでcount-1を直接伝えることです.