package com.hit.changyou; import android.R.bool; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.RectF; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.FloatMath; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; import android.widget.ViewFlipper; public class FloorViewer extends Activity implements OnTouchListener { public static final int RESULT_CODE_NOFOUND = 200; ViewFlipper viewFlipper = null; float startX, endX; Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); DisplayMetrics dm; ImageView imgView; Bitmap bitmap; ImageView btnback; EditText beginEditText; EditText endEditText; ImageView exchangeImageView; private ZoomImageView zoomImg; //ImageView navibtn; /** 最小缩放比例 */ float minScaleR = 1.0f; /** 最大缩放比例 */ static final float MAX_SCALE = 10f; /** 初始状态 */ static final int NONE = 0; /** 拖动 */ static final int DRAG = 1; /** 缩放 */ static final int ZOOM = 2; /** 当前模式 */ int mode = NONE; String value; PointF prev = new PointF(); PointF mid = new PointF(); float dist = 1f; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if(requestCode == 0 && resultCode == RESULT_OK) { setResult(RESULT_OK); finish(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Intent intent = new Intent(); intent.setClass(FloorViewer.this, AirportActivity.class); startActivity(intent); finish(); return false; } return false; } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); } @Override public void onCreate(Bundle savedInstanceState) throws OutOfMemoryError{ super.onCreate(savedInstanceState); // 获取图片资源 Intent intent = getIntent(); value = intent.getStringExtra("val"); Log.i("yxy", value); Toast.makeText(FloorViewer.this, value, Toast.LENGTH_SHORT).show(); if (value.equals("floor01")) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.floor_01); } else if (value.equals("floor02")) { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.floor_02); } else { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.floor_03); } setContentView(R.layout.floorshow); // BitmapFactory.Options.this.inTempStorage=; imgView = (ImageView) findViewById(R.id.imageView1);// 获取控件 // zoomImg = (ZoomImageView)findViewById(R.id.image); // zoomImg.setImage(bitmap); if (!bitmap.isRecycled()) { imgView.setImageBitmap(bitmap);// 填充控件 } /*navibtn = (ImageView)findViewById(R.id.ImageView01); navibtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub } });*/ imgView.setOnTouchListener(this);// 设置触屏监听 dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率 minZoom(); center(); imgView.setImageMatrix(matrix); // // viewFlipper = (ViewFlipper) this.findViewById(R.id.viewFlipper); btnback = (ImageView)findViewById(R.id.back_port); btnback.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(FloorViewer.this, AirportActivity.class); startActivity(intent); } }); beginEditText = (EditText)findViewById(R.id.editText1); beginEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View arg0, boolean arg1) { // TODO Auto-generated method stub Log.i("yxy", "editbegin"); if (!beginEditText.getText().toString().equals("")&&!endEditText.getText().toString().equals("")) { exchangeImageView.setVisibility(ImageView.VISIBLE); } else { exchangeImageView.setVisibility(ImageView.INVISIBLE); } } }); endEditText = (EditText)findViewById(R.id.editText2); endEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View arg0, boolean arg1) { // TODO Auto-generated method stub Log.i("yxy", "editend"); if (!beginEditText.getText().toString().equals("")&&!endEditText.getText().toString().equals("")) { exchangeImageView.setVisibility(ImageView.VISIBLE); } else { exchangeImageView.setVisibility(ImageView.INVISIBLE); } } }); exchangeImageView = (ImageView)findViewById(R.id.imageView2); exchangeImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (exchangeImageView.getVisibility()==ImageView.VISIBLE) { String temp=beginEditText.getText().toString(); beginEditText.setText(endEditText.getText()); endEditText.setText(temp); } } }); } public void SureOnClick(View v) { } /** * 触屏监听 */ @Override public boolean onTouch(View v, MotionEvent event) throws OutOfMemoryError{ switch (event.getAction() & MotionEvent.ACTION_MASK) { // 主点按下 case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix); prev.set(event.getX(), event.getY()); mode = DRAG; startX = event.getX(); break; // 副点按下 case MotionEvent.ACTION_POINTER_DOWN: dist = spacing(event); // 如果连续两点距离大于10,则判定为多点模式 if (spacing(event) > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: endX = event.getX(); mode = NONE; // savedMatrix.set(matrix); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { matrix.set(savedMatrix); matrix.postTranslate(event.getX() - prev.x, event.getY() - prev.y); } else if (mode == ZOOM) { float newDist = spacing(event); if (newDist > 10f) { matrix.set(savedMatrix); float tScale = newDist / dist; matrix.postScale(tScale, tScale, mid.x, mid.y); } } break; } imgView.setImageMatrix(matrix); CheckView(); return true; } /** * 限制最大最小缩放比例,自动居中 */ private void CheckView() throws OutOfMemoryError{ float f[] = new float[9]; matrix.getValues(f); float x1 = f[0] * 0 + f[1] * 0 + f[2]; float y1 = f[3] * 0 + f[4] * 0 + f[5]; float x2 = f[0] * bitmap.getWidth() + f[1] * 0 + f[2]; float y2 = f[3] * bitmap.getWidth() + f[4] * 0 + f[5]; float x3 = f[0] * 0 + f[1] * bitmap.getHeight() + f[2]; float y3 = f[3] * 0 + f[4] * bitmap.getHeight() + f[5]; float x4 = f[0] * bitmap.getWidth() + f[1] * bitmap.getHeight() + f[2]; float y4 = f[3] * bitmap.getWidth() + f[4] * bitmap.getHeight() + f[5]; // 图片现宽度 double width = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // 缩放比率判断 int widthScreen = dm.widthPixels; int heightScreen = dm.heightPixels; // if (width < widthScreen / 3 || width > widthScreen * 3) { // // } // 出界判断 if (mode == DRAG) { if ((x1 < widthScreen / 3 && x2 < widthScreen / 3 && x3 < widthScreen / 3 && x4 < widthScreen / 3) || (y1 < heightScreen / 3 && y2 < heightScreen / 3 && y3 < heightScreen / 3 && y4 < heightScreen / 3)) { Intent intent = new Intent(FloorViewer.this, FloorViewer.class); String value = getIntent().getStringExtra("val"); if (value.equals("floor01")) intent.putExtra("val", "floor02"); if (value.equals("floor02")) intent.putExtra("val", "floor03"); if (value.equals("floor03")) intent.putExtra("val", "floor01"); startActivityForResult(intent, 0); } if ((x1 > widthScreen * 2 / 3 && x2 > widthScreen * 2 / 3 && x3 > widthScreen * 2 / 3 && x4 > widthScreen * 2 / 3) || (y1 > heightScreen * 2 / 3 && y2 > heightScreen * 2 / 3 && y3 > heightScreen * 2 / 3 && y4 > heightScreen * 2 / 3)) { Intent intent = new Intent(FloorViewer.this, FloorViewer.class); String value = getIntent().getStringExtra("val"); if (value.equals("floor01")) intent.putExtra("val", "floor03"); if (value.equals("floor02")) intent.putExtra("val", "floor01"); if (value.equals("floor03")) intent.putExtra("val", "floor02"); startActivityForResult(intent, 0); } } if (mode == ZOOM) { if (f[0] < minScaleR) { // Log.d("", "当前缩放级别:"+p[0]+",最小缩放级别:"+minScaleR); matrix.setScale(minScaleR, minScaleR); } if (f[0] > MAX_SCALE) { // Log.d("", "当前缩放级别:"+p[0]+",最大缩放级别:"+MAX_SCALE); matrix.set(savedMatrix); } } center(); } /** * 最小缩放比例,最大为100% */ private void minZoom() { minScaleR = Math.min( (float) dm.widthPixels / (float) bitmap.getWidth(), (float) dm.heightPixels / (float) bitmap.getHeight()); if (minScaleR < 1.0) { matrix.postScale(minScaleR, minScaleR); } } private void center() { /* * if (endX > startX) { // 向右滑动 viewFlipper.setInAnimation(this, * R.anim.push_right_in); viewFlipper.setOutAnimation(this, * R.anim.push_right_out); viewFlipper.showNext(); } if (event.getX() < * startX) { // 向左滑动 viewFlipper.setInAnimation(this, * R.anim.push_left_in); viewFlipper.setOutAnimation(this, * R.anim.push_left_out); viewFlipper.showPrevious(); } */ center(true, true); } /** * 横向、纵向居中 */ protected void center(boolean horizontal, boolean vertical) throws OutOfMemoryError{ Matrix m = new Matrix(); m.set(matrix); RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()); m.mapRect(rect); float height = rect.height(); float width = rect.width(); float deltaX = 0, deltaY = 0; if (vertical) { // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移 int screenHeight = dm.heightPixels; if (height < screenHeight) { deltaY = (screenHeight - height) / 2 - rect.top; } else if (rect.top > 0) { deltaY = -rect.top; } else if (rect.bottom < screenHeight) { deltaY = imgView.getHeight() - rect.bottom; } } if (horizontal) { int screenWidth = dm.widthPixels; if (width < screenWidth) { deltaX = (screenWidth - width) / 2 - rect.left; } else if (rect.left > 0) { deltaX = -rect.left; } else if (rect.right < screenWidth) { deltaX = screenWidth - rect.right; } } matrix.postTranslate(deltaX, deltaY-100); } /** * 两点的距离 */ 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); } public static class ImageViewOnClickListener implements View.OnClickListener { private Context context; private String img_path; public ImageViewOnClickListener(Context context, String img_path) { this.img_path = img_path; this.context = context; } @Override public void onClick(View v) { if (img_path != null) { Intent intent = new Intent(context, FloorViewer.class); intent.putExtra("PhotoPath", img_path); context.startActivity(intent); } } } }