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(“IMG”));// 获取图片资源
- 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() – prev.x, event.getY()
- – 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 – height) / 2 – 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() – 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 – width) / 2 – 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> – 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) – event.getX(1);
- float <span class="attribute">y</span> = <span class="attribute-value">event</span>.getY(0) – 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">“1.0”</span> <span class="attribute">encoding</span>=<span class="attribute-value">“utf-8”</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">“http://schemas.android.com/apk/res/android”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_gravity</span>=<span class="attribute-value">“center”</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">“@+id/imag”</span>
- <span class="attribute">android:layout_width</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_height</span>=<span class="attribute-value">“fill_parent”</span>
- <span class="attribute">android:layout_gravity</span>=<span class="attribute-value">“center”</span>
- <span class="attribute">android:scaleType</span>=<span class="attribute-value">“matrix”</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>
💬 评论