http://www.cnblogs.com/dwinter/archive/2012/01/12/2321082.html

Activity:

**[html]** [view plain](http://blog.csdn.net/n70joey/article/details/7993188#)[copy](http://blog.csdn.net/n70joey/article/details/7993188#)
  <div>
    <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1">
    </embed>
  </div>
</div>
- /**

- * 图片浏览、缩放、拖动、自动居中

- */

- public class Touch extends Activity implements OnTouchListener {

- 
- Matrix <span class="attribute">matrix</span> = <span class="attribute-value">new</span> Matrix();

- Matrix <span class="attribute">savedMatrix</span> = <span class="attribute-value">new</span> Matrix();

- DisplayMetrics dm;

- ImageView imgView;

- Bitmap bitmap;

- 
- float minScaleR;// 最小缩放比例

- static final float <span class="attribute">MAX_SCALE</span> = <span class="attribute-value">4f</span>;// 最大缩放比例

- 
- static final int <span class="attribute">NONE</span> = <span class="attribute-value"></span>;// 初始状态

- static final int <span class="attribute">DRAG</span> = <span class="attribute-value">1</span>;// 拖动

- static final int <span class="attribute">ZOOM</span> = <span class="attribute-value">2</span>;// 缩放

- int <span class="attribute">mode</span> = <span class="attribute-value">NONE</span>;

- 
- PointF <span class="attribute">prev</span> = <span class="attribute-value">new</span> PointF();

- PointF <span class="attribute">mid</span> = <span class="attribute-value">new</span> PointF();

- float <span class="attribute">dist</span> = <span class="attribute-value">1f</span>;

- 
- @Override

- public void onCreate(Bundle savedInstanceState) {

- super.onCreate(savedInstanceState);

- setContentView(R.layout.scale);

- <span class="attribute">imgView</span> = (ImageView) findViewById(R.id.imag);// 获取控件

- <span class="attribute">bitmap</span> = <span class="attribute-value">BitmapFactory</span>.decodeResource(getResources(), this.getIntent()

- .getExtras().getInt(&#8220;IMG&#8221;));// 获取图片资源

- imgView.setImageBitmap(bitmap);// 填充控件

- imgView.setOnTouchListener(this);// 设置触屏监听

- <span class="attribute">dm</span> = <span class="attribute-value">new</span> DisplayMetrics();

- getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率

- minZoom();

- center();

- imgView.setImageMatrix(matrix);

- }

- 
- /**

- * 触屏监听

- */

- public boolean onTouch(View v, MotionEvent event) {

- 
- switch (event.getAction() & MotionEvent.ACTION_MASK) {

- // 主点按下

- case MotionEvent.ACTION_DOWN:

- savedMatrix.set(matrix);

- prev.set(event.getX(), event.getY());

- <span class="attribute">mode</span> = <span class="attribute-value">DRAG</span>;

- break;

- // 副点按下

- case MotionEvent.ACTION_POINTER_DOWN:

- <span class="attribute">dist</span> = <span class="attribute-value">spacing</span>(event);

- // 如果连续两点距离大于10,则判定为多点模式

- if (spacing(event) <span class="tag">></span> 10f) {

- savedMatrix.set(matrix);

- midPoint(mid, event);

- <span class="attribute">mode</span> = <span class="attribute-value">ZOOM</span>;

- }

- break;

- case MotionEvent.ACTION_UP:

- case MotionEvent.ACTION_POINTER_UP:

- <span class="attribute">mode</span> = <span class="attribute-value">NONE</span>;

- break;

- case MotionEvent.ACTION_MOVE:

- if (<span class="attribute">mode</span> == DRAG) {

- matrix.set(savedMatrix);

- matrix.postTranslate(event.getX() &#8211; prev.x, event.getY()

- &#8211; prev.y);

- } else if (<span class="attribute">mode</span> == ZOOM) {

- float <span class="attribute">newDist</span> = <span class="attribute-value">spacing</span>(event);

- if (newDist <span class="tag">></span> 10f) {

- matrix.set(savedMatrix);

- float <span class="attribute">tScale</span> = <span class="attribute-value">newDist</span> / dist;

- matrix.postScale(tScale, tScale, mid.x, mid.y);

- }

- }

- break;

- }

- imgView.setImageMatrix(matrix);

- CheckView();

- return true;

- }

- 
- /**

- * 限制最大最小缩放比例,自动居中

- */

- private void CheckView() {

- float p[] = new float[9];

- matrix.getValues(p);

- if (<span class="attribute">mode</span> == ZOOM) {

- if (p[0] <span class="tag"><</span> <span class="tag-name">minScaleR</span>) {

- matrix.setScale(minScaleR, minScaleR);

- }

- if (p[0] <span class="tag">></span> MAX_SCALE) {

- matrix.set(savedMatrix);

- }

- }

- center();

- }

- 
- /**

- * 最小缩放比例,最大为100%

- */

- private void minZoom() {

- <span class="attribute">minScaleR</span> = <span class="attribute-value">Math</span>.min(

- (float) dm.widthPixels / (float) bitmap.getWidth(),

- (float) dm.heightPixels / (float) bitmap.getHeight());

- if (minScaleR <span class="tag"><</span> <span class="tag-name">1.0</span>) {

- matrix.postScale(minScaleR, minScaleR);

- }

- }

- 
- private void center() {

- center(true, true);

- }

- 
- /**

- * 横向、纵向居中

- */

- protected void center(boolean horizontal, boolean vertical) {

- 
- Matrix <span class="attribute">m</span> = <span class="attribute-value">new</span> Matrix();

- m.set(matrix);

- RectF <span class="attribute">rect</span> = <span class="attribute-value">new</span> RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());

- m.mapRect(rect);

- 
- float <span class="attribute">height</span> = <span class="attribute-value">rect</span>.height();

- float <span class="attribute">width</span> = <span class="attribute-value">rect</span>.width();

- 
- float <span class="attribute">deltaX</span> = <span class="attribute-value"></span>, <span class="attribute">deltaY</span> = <span class="attribute-value"></span>;

- 
- if (vertical) {

- // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移

- int <span class="attribute">screenHeight</span> = <span class="attribute-value">dm</span>.heightPixels;

- if (height <span class="tag"><</span> <span class="tag-name">screenHeight</span>) {

- <span class="attribute">deltaY</span> = (screenHeight &#8211; height) / 2 &#8211; rect.top;

- } else if (rect.top <span class="tag">></span> 0) {

- <span class="attribute">deltaY</span> = -rect.top;

- } else if (rect.bottom <span class="tag"><</span> <span class="tag-name">screenHeight</span>) {

- <span class="attribute">deltaY</span> = <span class="attribute-value">imgView</span>.getHeight() &#8211; rect.bottom;

- }

- }

- 
- if (horizontal) {

- int <span class="attribute">screenWidth</span> = <span class="attribute-value">dm</span>.widthPixels;

- if (width <span class="tag"><</span> <span class="tag-name">screenWidth</span>) {

- <span class="attribute">deltaX</span> = (screenWidth &#8211; width) / 2 &#8211; rect.left;

- } else if (rect.left <span class="tag">></span> 0) {

- <span class="attribute">deltaX</span> = -rect.left;

- } else if (rect.right <span class="tag"><</span> <span class="tag-name">screenWidth</span>) {

- <span class="attribute">deltaX</span> = <span class="attribute-value">screenWidth</span> &#8211; rect.right;

- }

- }

- matrix.postTranslate(deltaX, deltaY);

- }

- 
- /**

- * 两点的距离

- */

- private float spacing(MotionEvent event) {

- float <span class="attribute">x</span> = <span class="attribute-value">event</span>.getX(0) &#8211; event.getX(1);

- float <span class="attribute">y</span> = <span class="attribute-value">event</span>.getY(0) &#8211; event.getY(1);

- return FloatMath.sqrt(x * x + y * y);

- }

- 
- /**

- * 两点的中点

- */

- private void midPoint(PointF point, MotionEvent event) {

- float <span class="attribute">x</span> = <span class="attribute-value">event</span>.getX(0) + event.getX(1);

- float <span class="attribute">y</span> = <span class="attribute-value">event</span>.getY(0) + event.getY(1);

- point.set(x / 2, y / 2);

- }

- }

 

**[html]** [view plain](http://blog.csdn.net/n70joey/article/details/7993188#)[copy](http://blog.csdn.net/n70joey/article/details/7993188#)
  <div>
    <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2">
    </embed>
  </div>
</div>
- <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span>

- <span class="tag"><</span><span class="tag-name">FrameLayout</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_gravity</span>=<span class="attribute-value">&#8220;center&#8221;</span> <span class="tag">></span>

- 
- <span class="tag"><</span><span class="tag-name">ImageView</span>

- <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/imag&#8221;</span>

- <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;fill_parent&#8221;</span>

- <span class="attribute">android:layout_gravity</span>=<span class="attribute-value">&#8220;center&#8221;</span>

- <span class="attribute">android:scaleType</span>=<span class="attribute-value">&#8220;matrix&#8221;</span> <span class="tag">></span>

- <span class="tag"></</span><span class="tag-name">ImageView</span><span class="tag">></span>

- 
- <span class="tag"></</span><span class="tag-name">FrameLayout</span><span class="tag">></span>

 

💬 评论