如何重置ImageView的位置?

时间:2013-07-16 12:26:17

标签: java android imageview

在我的程序中,我可以在屏幕上移动图像吗?有时我会从网站上丢失它,但找不到它。我想添加将图像置于原始位置的功能。 我自己的方法不起作用(and related question to it to make it work):

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<ImageView> images;
    public int reset = 0;
    HashMap<Integer, Bitmap> map = new HashMap<Integer, Bitmap>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.image_show);
        app = this;
        images = new ArrayList<ImageView>(
                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 < length - 1) {
                    p++;
                } else {
                    p = 0;
                }
                gallery.setSelection(p, true);
                img_counter_tv.setText(p + 1 + "/" + length);
            }
        });

        Button backButton = (Button) findViewById(R.id.back_btn);
        backButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (p == 0) {
                    p = length - 1;
                } else {
                    p--;
                }
                gallery.setSelection(p, true);
                img_counter_tv.setText(p + 1 + "/" + length);

            }
        });


    }

    public void rotateS(View v) {
        ImageView iv = current;
        Bitmap b = ((BitmapDrawable) iv.getDrawable()).getBitmap();
        Matrix matrix = new Matrix();
        matrix.postRotate(geg);
        Bitmap bMapRotate = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
                b.getHeight(), matrix, true);
        iv.setImageBitmap(bMapRotate);
    }

    public void extendS(View v) {

        reset = 1;
        Log.d("restart", "yes");

        runOnUiThread(new Runnable() {
            public void run() {
                View viewToUpdate = gallery.getChildAt(p - gallery.getFirstVisiblePosition());
                viewToUpdate.invalidate();
//              ia.notifyDataSetChanged();

            }
        });



    }

    public static Bitmap resizeBitmap(Bitmap photo, float x, float y) {

        try {
            // get current bitmap width and height
            int width = photo.getWidth();
            int height = photo.getHeight();

            // determine how much to scale
            float scaleWidth = x / width;
            float scaleHeight = y / height;
            Log.d("aspect3", "w: " + scaleWidth + " h: " + scaleHeight);
            // create the matrix for the manipulation
            Matrix matrix = new Matrix();
            // resize the bitmap
            matrix.postScale(scaleWidth, scaleHeight);

            // recreate the new bitmap
            Bitmap resizebitmap = Bitmap.createBitmap(photo, 0, 0, width,
                    height, matrix, false);
            return resizebitmap;

        } catch (NullPointerException e) {
            e.printStackTrace();
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            System.gc();
        }
        return null;
    }

    class ImageAdapterr extends BaseAdapter {

        /** The parent context */
        private Context myContext;

        /** Simple Constructor saving the 'parent' context. */
        public ImageAdapterr(Context c) {
            this.myContext = c;
        }
        Matrix savedMatrix = new Matrix();
        /** Returns the amount of images we have defined. */
        public int getCount() {
            return UILApplication.photo_buffer_big.size();
        }

        /* Use the array-Positions as unique IDs */
        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        /**
         * Returns a new ImageView to be displayed, depending on the position
         * passed.
         */


        public View getView(final int position, View convertView,
                ViewGroup parent) {

            ImageView imView = new ImageView(this.myContext);
            current = imView;
            imgPos = position;
            if (bm==null){
            AsyncLoad imLoad = new AsyncLoad();
            imLoad.execute();
            try {
                bm = imLoad.get();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
            if (bm != null) {
                imView.setImageBitmap(bm);
            } else if (bm == null) {
                imView.setImageResource(R.drawable.logo);
            }
            /* Image should be scaled as width/height are set. */
            imView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            /* Set the Width/Height of the ImageView. */
            imView.setLayoutParams(new Gallery.LayoutParams(
                    LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
            imView.setOnTouchListener(new OnTouchListener() {
                private static final String TAG = "Touch";
                // These matrices will be used to move and zoom image


                PointF start = new PointF();
                public PointF mid = new PointF();

                // We can be in one of these 3 states
                public static final int NONE = 0;
                public static final int DRAG = 1;
                public static final int ZOOM = 2;
                public int mode = NONE;

                float oldDist;

                public boolean onTouch(View v, MotionEvent event) {

                    ImageView view = (ImageView) v;
                    view.setScaleType(ImageView.ScaleType.MATRIX);
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:

                        savedMatrix.set(matrix);
                        start.set(event.getX(), event.getY());
                        Log.d(TAG, "mode=DRAG");
                        mode = DRAG;
                        break;

                    case MotionEvent.ACTION_POINTER_DOWN:

                        oldDist = spacing(event);
                        Log.d(TAG, "oldDist=" + oldDist);
                        if (oldDist > 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<Void, Void, Bitmap> {
        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          

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/top_tab_bg"
        android:padding="10dp" >

        <Button
            android:id="@+id/analitics_back_btn"
            style="@style/ButtonText"
            android:layout_marginRight="5dip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/back_btn"
            android:background="@drawable/btn_clk_selector"
            android:text="Назад" />

        <Button
            android:id="@+id/btn_rotate"
            style="@style/ButtonText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dip"
            android:layout_toLeftOf="@+id/analitics_back_btn"
            android:background="@drawable/btn_clk_selector"
            android:onClick="rotateS"
            android:text="Повернуть" />
        <Button
            android:id="@+id/btn_ex"
            style="@style/ButtonText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dip"
            android:layout_toLeftOf="@+id/btn_rotate"
            android:background="@drawable/btn_clk_selector"
            android:onClick="extendS"
            android:text="рас" />

        <Button
            android:id="@+id/next_btn"
            style="@style/ButtonText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginLeft="5dp"
            android:background="@drawable/next_img_btn"
            android:paddingRight="10dp" />

        <TextView
            android:id="@+id/img_counter"
            style="@style/ButtonText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@+id/next_btn"
            android:text="1/10" />

        <Button
            android:id="@+id/back_btn"
            style="@style/ButtonText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_toLeftOf="@+id/img_counter"
            android:background="@drawable/back_img_btn" />
    </RelativeLayout>

<RelativeLayout
    android:id="@+id/gal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

            <Gallery
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/gallery"
                android:adjustViewBounds="true"
                android:spacing="10dp"
            />
</RelativeLayout>
</LinearLayout>

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

2 个答案:

答案 0 :(得分:2)

使用以下代码:

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 } 事实上。现在应该可以了。

答案 1 :(得分:0)

尝试在代码中使用此功能,在屏幕上的任意位置设置图像视图,

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;

按宽度和高度,您将获得手机的屏幕尺寸。