如何重置ImageView的位置?

在我的程序中,我可以在屏幕上移动图像吗? 有时候我会从网站上丢失它而无法找到它。 我想添加将图像置于原始位置的function。 我自己的方法不起作用( 以及相关的问题,以使其工作 ):

ImageView iv = current; Matrix matrix = iv.getImageMatrix; float[] values = new float[9]; matrix.getValues(values); int a = values[Matrix.MTRANS_X]; int b = values[Matrix.MTRANS_Y]; matrix.postTranslate(-a,-b); iv.setImageMatrix(matrix); 

编辑:最新代码

 import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutionException; import ua.mirkvartir.android.frontend.UILApplication; import android.app.Activity; import android.app.Fragment; import android.app.ProgressDialog; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.drawable.BitmapDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.view.MotionEventCompat; import android.util.FloatMath; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.Gallery; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; public class ImageShowActivity extends Activity { int p = 0; Activity app; ImageAdapterr ia; ImageView imView; int imgPos = 0; Bitmap bm = null; int geg = 90; public int width = 0; public int hight = 0; Gallery gallery; Matrix matrix = new Matrix(); Matrix shift = new Matrix(); private int INVALID_POINTER_ID = -1; private int mActivePointerId = INVALID_POINTER_ID; private ScaleGestureDetector mScaleDetector; private float mLastTouchX = 0; private float mLastTouchY = 0; private float mPosX = 0; private float mPosY = 0; ImageView current; public List images; public int reset = 0; HashMap map = new HashMap(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_show); app = this; images = new ArrayList( UILApplication.photo_buffer_big.size()); Log.d("images", UILApplication.photo_buffer_big.size() + ""); Log.d("images", images.size() + ""); gallery = (Gallery) findViewById(R.id.gallery); // EDGES ARE INVISIBLE gallery.setHorizontalFadingEdgeEnabled(false); ia = new ImageAdapterr(this); gallery.setAdapter(ia); final int length = UILApplication.photo_buffer_big.size(); Button back_btn = (Button) findViewById(R.id.analitics_back_btn); back_btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { finish(); } }); final TextView img_counter_tv = (TextView) findViewById(R.id.img_counter); img_counter_tv.setText(p + 1 + "/" + length); Button nextButton = (Button) findViewById(R.id.next_btn); nextButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (p  10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; Log.d(TAG, "mode=ZOOM"); } 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); Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; Log.d(TAG, "mode=NONE"); break; } // Perform the transformation Log.d("point", (event.getX() - start.x) + " " + (event.getY() - start.y)); // Log.d("point",start.x +" "+start.y); float[] values = new float[9]; matrix.getValues(values); float a = values[Matrix.MTRANS_X]; float b = values[Matrix.MTRANS_Y]; Log.d("touch matrix", values[Matrix.MPERSP_0] + " " + values[Matrix.MPERSP_1] + " " + values[Matrix.MPERSP_2]); Log.d("touch matrix scale", values[Matrix.MSCALE_X] + " " + values[Matrix.MSCALE_Y]); Log.d("touch matrix scew", values[Matrix.MSKEW_X] + " " + values[Matrix.MSKEW_Y]); Log.d("touch matrix trans", values[Matrix.MTRANS_X] + " " + values[Matrix.MTRANS_Y]); if (reset == 1) { matrix.reset(); savedMatrix.reset(); } view.setImageMatrix(matrix); reset = 0; // images.set(position, view); return true; // indicate event was handled } 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); } }); return imView; } /** * Returns the size (0.0f to 1.0f) of the views depending on the * 'offset' to the center. */ public float getScale(boolean focused, int offset) { /* Formula: 1 / (2 ^ offset) */ return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset))); } } class AsyncLoad extends AsyncTask { ProgressDialog pd; @Override protected void onPreExecute() { pd = new ProgressDialog(app); pd.setOwnerActivity(app); pd.setTitle("Идет загрузка..."); pd.setCancelable(true); pd.show(); } @Override protected Bitmap doInBackground(Void... arg0) { // TODO Auto-generated method stub try { /* * Open a new URL and get the InputStream to load data from it. */ URL aURL = new URL(UILApplication.photo_buffer_big.get(imgPos)); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); /* Buffered is always good for a performance plus. */ BufferedInputStream bis = new BufferedInputStream(is); /* Decode url-data to a bitmap. */ bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); /* Apply the Bitmap to the ImageView that will be returned. */ // imView.setImageBitmap(bm); } catch (IOException e) { // imView.setImageResource(R.drawable.logo); bm = null; Log.e("DEBUGTAG", "Remote Image Exception", e); } map.put(imgPos, bm); Log.d("map", map.size() + ""); return bm; } @Override protected void onPostExecute(Bitmap arg0) { pd.dismiss(); } } } 

XML

   

编辑:新代码的问题 – 调用放大后图像没有rest。 它在屏幕上的放大呼叫+标签后重置。 图像也被部分重置 – 它会转到原始位置和比例,但它会达到其原始分辨率。 所以通常我的bacamos比屏幕小得多,而我需要它来填充屏幕。

使用下面的代码:

 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); imageView = new ImageView(this); imageView.setLayoutParams(params); imageView.setImageBitmap(bitmap); layout.setGravity(Gravity.CENTER_VERTICAL | Gravity.TOP); layout.addView(imageView); 

这会将ImageView定位在包含它的RelativeLayout的中心。

编辑 :在上面的代码中看到 – 我将RelativeLayout.LayoutParams更改为LinearLayout.LayoutParams ,因为它是LinearLayout ,实际上包含RelativeLayout 。 现在它应该工作。

尝试在代码中使用它来在屏幕上的任何位置设置图像视图,

 iconSMS.setImageResource(R.drawable.ic_launcher_smsmms); LayoutParams paramsIconSMS = new LayoutParams(iconwidth,iconheight); iconwidthspacing=(int)Math.round(((float)width/480)*(float)45); iconheightspacing=(int)Math.round(((float)height/800)*(float)520); paramsIconSMS.setMargins(iconwidthspacing, iconheightspacing, 0, 0); iconSMS.setId(204); iconSMS.setLayoutParams(paramsIconSMS); 

这里,

 iconwidth=(int)Math.round(width*iconwidthf); iconheight=(int)Math.round(height*iconheightf); 

和宽度和高度变量是,

 requestWindowFeature(Window.FEATURE_NO_TITLE); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.widthPixels; height = metrics.heightPixels; 

通过宽度和高度,您可以获得手机的屏幕尺寸(以像素为单位)。