精华内容
下载资源
问答
  • TouchImageView自定义ImageView 缩放、移动、旋转 为实现拍照返回后 在照片添加 装饰物图片
  • Android ImageView移动和缩放

    千次阅读 2016-11-17 18:25:54
    要实现ImageView的缩放就要使用到我们大学里面学习的线代里面的矩阵(Matrix),我们看一下源码就可以知道 public static final int MSCALE_X = 0; //! public static final int MSKEW_X = 1; //!...

    要实现ImageView的缩放就要使用到我们大学里面学习的线代里面的矩阵(Matrix),我们看一下源码就可以知道

        public static final int MSCALE_X = 0;   //!< use with getValues/setValues
        public static final int MSKEW_X  = 1;   //!< use with getValues/setValues
        public static final int MTRANS_X = 2;   //!< use with getValues/setValues
        public static final int MSKEW_Y  = 3;   //!< use with getValues/setValues
        public static final int MSCALE_Y = 4;   //!< use with getValues/setValues
        public static final int MTRANS_Y = 5;   //!< use with getValues/setValues
        public static final int MPERSP_0 = 6;   //!< use with getValues/setValues
        public static final int MPERSP_1 = 7;   //!< use with getValues/setValues
        public static final int MPERSP_2 = 8;   //!< use with getValues/setValues
     @Override
        public String toString() {
            StringBuilder sb = new StringBuilder(64);
            sb.append("Matrix{");
            toShortString(sb);
            sb.append('}');
            return sb.toString();
    
        }
    public void toShortString(StringBuilder sb) {
            float[] values = new float[9];
            getValues(values);
            sb.append('[');
            sb.append(values[0]); sb.append(", "); sb.append(values[1]); sb.append(", ");
            sb.append(values[2]); sb.append("][");
            sb.append(values[3]); sb.append(", "); sb.append(values[4]); sb.append(", ");
            sb.append(values[5]); sb.append("][");
            sb.append(values[6]); sb.append(", "); sb.append(values[7]); sb.append(", ");
            sb.append(values[8]); sb.append(']');
        }

    这其实就是一个3*3的矩阵,然后我们就可以知道具体的坐标属性为
    {MSCALE_X,MSKEW_X,MTRANS_X,
    MSKEW_Y, MSCALE_Y,MTRANS_Y,
    MPERSP_0,MPERSP_1,MPERSP_2}
    其中 MSCALE_X和MSCALE_Y分别是控制X轴和Y轴方向的缩放,MSKEW_X和MSKEW_Y分别是控制X坐标和Y坐标的线性倾斜系数,MTRANS_X和MTRANS_Y分别是控制X方向和Y方向的线性平移。MPERSP_0、MPERSP_1和MPERSP_2是关于透视的,我们这里使用不到也就不做解释了。
    这个矩阵其实也是一个默认的单位矩阵,单位矩阵为

    E=(1,0,0
        0,1,0
        0,0,1)
    

    也就是在默认的情况下我们的矩阵对ImageView的缩放、平移是保持着默认的状态的。当我们的手指在屏幕上面移动的时候,所谓的单位矩阵里面的坐标值就会发生变化。
    先看一下效果图:
    这里写图片描述
    我们这次要实现的是关于图片的移动与缩放。但是图片的缩放是要有限制的,图片既不能无限的缩小更不能无限的放大,那么我们就需要对图片的放大和缩小进行限制了。怎么限制呢?我刚刚已经说了,当我们的手指在屏幕上面移动时,矩阵坐标值就会发生变化。那么我们就可以根据MSCALE_X和MSCALE_Y来对X和Y的坐标值进行一个限制。
    怎么获取获取的大小呢?我们可以通过获取缩放后的图片大小来获取MSCALE_X和和MSCALE_Y的值。

    img_test.post(new Runnable(){
        @Override
        public void run() {
    
        //获得图片的真实宽高,
        int drawableWidth = img_test.getDrawable().getBounds().width();
        int drawableHeight = img_test.getDrawable().getBounds().height();
    
        //获得变换矩阵以后的图片
        Matrix matrix = img_test.getImageMatrix();
        float[] values = new float[9];
        matrix.getValues(values);
    
        //获取变化矩阵中的MSCALE_X和MSCALE_Y的值
        float scaleX = values[0];
        float scaleY = values[4];
        }
        });
    

    获取到MSCALE_X和MSCALE_Y变化的值以后我们就可以根据变化的值做相应的判断。
    如果我们的图片特别大以至于宽或高已经超出了屏幕的宽或高,我们又想要显示出来的效果的宽或高正好是屏幕的宽或高。我们可以获取图片的真实的宽和高,然后屏幕的宽和高,最后用图片的真是宽或高/屏幕的宽或高进行缩放
    获取屏幕的分辨率
    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    要想获取图片的真是高度,我们就要先获取资源图片
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
    剩下的就是获取缩放的比例了
    float defaultScale = Math.min(
    ((float) displayMetrics.widthPixels / (float) bitmap.getWidth()),
    ((float) displayMetrics.heightPixels / (float) bitmap.getHeight()));
    下面我们开始进行图片的缩放,就需要处理触摸事件了。代码里面已经做了详细的注释就不再解释了。

    package com.lyxrobert.imagezoom;
    
    import android.app.Activity;
    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.view.MotionEvent;
    import android.view.View;
    import android.widget.ImageView;
    
    public class ImageViewZoomAty extends Activity implements View.OnTouchListener {
        Matrix matrix = new Matrix();
        Matrix savedMatrix = new Matrix();
        DisplayMetrics displayMetrics;
        ImageView img_test;
        Bitmap bitmap;
    
        float defaultScale ;// 最小缩放比例
        static final int NONE = 0;// 初始状态
        static final int DRAG = 1;// 拖动状态
        static final int ZOOM = 2;// 缩放状态
        int mode = NONE;
        PointF pointF = new PointF();
        PointF mid = new PointF();
        float scaleX = 0;
        float scaleY = 0;
        float dist = 1f;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            img_test = (ImageView) findViewById(R.id.img_test);// 获取控件
            bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);// 获取图片资源
            img_test.setImageBitmap(bitmap);// 填充控件
            img_test.setOnTouchListener(this);// 设置触屏监听
            displayMetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);// 获取分辨率
    
            defaulZoom();
            center(true,true);
            img_test.setImageMatrix(matrix);
        }
        /**
         * 触屏监听
         */
        public boolean onTouch(View v, MotionEvent event) {
    
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                // 单指按下
                case MotionEvent.ACTION_DOWN:
                    savedMatrix.set(matrix);
                    pointF.set(event.getX(), event.getY());
                    mode = DRAG;
                    break;
                //另外的手指按下
                case MotionEvent.ACTION_POINTER_DOWN:
                    dist = space2Point(event);
                    // 如果连续获取的两点之间的距离大于10f说明是多点触摸模式
                    if (space2Point(event) > 10f) {
                        savedMatrix.set(matrix);
                        midPoint(mid, event);
                        mode = ZOOM;
                    }
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        matrix.set(savedMatrix);
                        matrix.postTranslate(event.getX() - pointF.x, event.getY()
                                - pointF.y);
                    } else if (mode == ZOOM) {
                        float moveDistance = space2Point(event);
                        if (moveDistance > 10f) {
                            img_test.post(new Runnable(){
                                @Override
                                public void run() {
                                    //获得图片的变换矩阵
                                    Matrix m = img_test.getImageMatrix();
                                    float[] values = new float[9];
                                    m.getValues(values);
                                    //获取变化矩阵中的MSCALE_X和MSCALE_Y的值
                                    scaleX = values[0];
                                    scaleY = values[4];
                                    if (scaleX<0.8f){
                                        mode = NONE;
                                        float minScale =0.81f/scaleX;
                                        matrix.postScale(minScale, minScale, mid.x, mid.y);
                                    }else if(scaleX>2.5f){
                                        mode = NONE;
                                        float maxScale =2.5f/scaleX;
                                        matrix.postScale(maxScale, maxScale, mid.x, mid.y);
                                    }
                                }});
                            matrix.set(savedMatrix);
                            float tScale = moveDistance / dist;
                            matrix.postScale(tScale, tScale, mid.x, mid.y);
                        }
                    }
                    break;
            }
            img_test.setImageMatrix(matrix);
            center(true,true);
            return true;
        }
    
    
        /**
         * 为了适应屏幕的宽或高,需要做适度的缩放
         */
        private void defaulZoom() {
            defaultScale = Math.min(
                    ((float) displayMetrics.widthPixels / (float) bitmap.getWidth()),
                    ((float) displayMetrics.heightPixels / (float) bitmap.getHeight()));
            matrix.postScale(defaultScale, defaultScale);
        }
    
    
        /**
         * 让图片居中显示
         */
        protected void center(boolean isHorizontal, boolean isVertical) {
    
            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 (isVertical) {
                int screenHeight = displayMetrics.heightPixels;
                if (height < screenHeight) {
                    //如果图片的高度小于屏幕的高度,那么就要向下移动图片,因为上面的rect设置的图片默认显示在左上角
                    deltaY = (screenHeight - height) / 2 - rect.top;
                } else if (rect.top > 0) {
                    //说明图片的高度大于屏幕的高度并且上面留有空白需要上移
                    deltaY = -rect.top;
                } else if (rect.bottom < screenHeight) {
                    //说明图片的高度大于屏幕的高度并且下面留有空白需要下移
                    deltaY = img_test.getHeight() - rect.bottom;
                }
            }
    
            if (isHorizontal) {
                int screenWidth = displayMetrics.widthPixels;
                if (width < screenWidth) {
                    //如果图片的宽度小于屏幕的宽度,那么就要右移动图片,因为上面的rect设置的图片默认显示在左上角
                    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);
        }
    
        /**
         * 两点的距离
         */
        float distanceX;
        float distanceY;
        private float space2Point(MotionEvent event) {
            try {
                distanceX = event.getX(0) - event.getX(1);
                distanceY = event.getY(0) - event.getY(1);
                return (float) Math.sqrt(distanceX * distanceX + distanceY * distanceY);
            }catch (Exception e){
            }
            return (float) Math.sqrt(distanceX * distanceX+ distanceY * distanceY);
        }
        /**
         * 两点的中点
         */
        private void midPoint(PointF point, MotionEvent event) {
            float midX = event.getX(0) + event.getX(1);
            float midY = event.getY(0) + event.getY(1);
            point.set(midX / 2, midY / 2);
        }
    
    }
    

    布局文件activity_main

    <?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        >
        <ImageView android:layout_width="match_parent"
            android:id="@+id/img_test"
            android:scaleType="matrix"
            android:src="@drawable/test"
            android:layout_height="match_parent">
        </ImageView>
    </LinearLayout>

    点击下载源码

    这里写图片描述

    展开全文
  • 正如谷歌建议的那样,如果您定位Android 3.0及更高版本,则可以使用DragListener.对于pre-Honeycomb版本,您可以使用以下内容:// The ‘active pointer’ is the one currently moving our object.private int ...

    正如谷歌建议的那样,如果您定位Android 3.0及更高版本,则可以使用DragListener.

    对于pre-Honeycomb版本,您可以使用以下内容:

    // The ‘active pointer’ is the one currently moving our object.

    private int mActivePointerId = INVALID_POINTER_ID;

    @Override

    public boolean onTouchEvent(MotionEvent ev) {

    // Let the ScaleGestureDetector inspect all events.

    mScaleDetector.onTouchEvent(ev);

    final int action = MotionEventCompat.getActionMasked(ev);

    switch (action) {

    case MotionEvent.ACTION_DOWN: {

    final int pointerIndex = MotionEventCompat.getActionIndex(ev);

    final float x = MotionEventCompat.getX(ev,pointerIndex);

    final float y = MotionEventCompat.getY(ev,pointerIndex);

    // Remember where we started (for dragging)

    mLastTouchX = x;

    mLastTouchY = y;

    // Save the ID of this pointer (for dragging)

    mActivePointerId = MotionEventCompat.getPointerId(ev,0);

    break;

    }

    case MotionEvent.ACTION_MOVE: {

    // Find the index of the active pointer and fetch its position

    final int pointerIndex =

    MotionEventCompat.findPointerIndex(ev,mActivePointerId);

    final float x = MotionEventCompat.getX(ev,pointerIndex);

    final float y = MotionEventCompat.getY(ev,pointerIndex);

    // Calculate the distance moved

    final float dx = x - mLastTouchX;

    final float dy = y - mLastTouchY;

    mPosX += dx;

    mPosY += dy;

    invalidate();

    // Remember this touch position for the next move event

    mLastTouchX = x;

    mLastTouchY = y;

    break;

    }

    case MotionEvent.ACTION_UP: {

    mActivePointerId = INVALID_POINTER_ID;

    break;

    }

    case MotionEvent.ACTION_CANCEL: {

    mActivePointerId = INVALID_POINTER_ID;

    break;

    }

    case MotionEvent.ACTION_POINTER_UP: {

    final int pointerIndex = MotionEventCompat.getActionIndex(ev);

    final int pointerId = MotionEventCompat.getPointerId(ev,pointerIndex);

    if (pointerId == mActivePointerId) {

    // This was our active pointer going up. Choose a new

    // active pointer and adjust accordingly.

    final int newPointerIndex = pointerIndex == 0 ? 1 : 0;

    mLastTouchX = MotionEventCompat.getX(ev,newPointerIndex);

    mLastTouchY = MotionEventCompat.getY(ev,newPointerIndex);

    mActivePointerId = MotionEventCompat.getPointerId(ev,newPointerIndex);

    }

    break;

    }

    }

    return true;

    }

    正如谷歌here所建议的那样.

    展开全文
  • ImageView用来显示任意图像图片,可以自己定义显示尺寸,显示颜色等等.运行效果是这样的(文字说明):首次进入程序,手指点击屏幕上的任意位置,图片会随之移动。布局文件android:id="@+id/FrameLayout01"android:...

    ImageView用来显示任意图像图片,可以自己定义显示尺寸,显示颜色等等.

    运行效果是这样的(文字说明):

    首次进入程序,手指点击屏幕上的任意位置,图片会随之移动。

    布局文件

    android:id="@+id/FrameLayout01"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="#f0f0f0" >

    android:id="@+id/ImageView01"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:src="@drawable/icon" >

    实现代码

    public class MoveImageView extends ImageView {

    public MoveImageView(Context context) {

    super(context);

    }

    public MoveImageView(Context context, AttributeSet attrs) {

    super(context, attrs, 0);

    }

    public MoveImageView(Context context, AttributeSet attrs, int defStyle) {

    super(context, attrs, defStyle);

    }

    public void setLocation(int x, int y) {

    this.setFrame(x, y - this.getHeight(), x + this.getWidth(), y);

    }

    // 移动

    public boolean autoMouse(MotionEvent event) {

    boolean rb = false;

    switch (event.getAction()) {

    case MotionEvent.ACTION_MOVE:

    this.setLocation((int) event.getX(), (int) event.getY());

    rb = true;

    break;

    }

    return rb;

    }

    }

    public class TestImageViewMove extends Activity {

    private MoveImageView moveImageView;

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    moveImageView = (MoveImageView) this.findViewById(R.id.ImageView01);

    }

    @Override

    public boolean onTouchEvent(MotionEvent event) {

    moveImageView.autoMouse(event);

    return false;

    }

    }

    以上内容给大家介绍了基于Android实现随手指移动的ImageView的相关知识,希望本文分享对大家有所帮助。

    展开全文
  • 需要注意的是在布局中要设置imageview android:scaleType="matrix" 代码如下: XImageView.java import android.content.Context; import android.graphics.Matrix; import android.graphics.PointF; ...

    效果图:



    需要注意的是在布局中要设置imageview  android:scaleType="matrix"


    代码如下:

    XImageView.java

    import android.content.Context;
    import android.graphics.Matrix;
    import android.graphics.PointF;
    import android.util.AttributeSet;
    import android.util.FloatMath;
    import android.view.MotionEvent;
    import android.widget.ImageView;
    
    public class XImageView extends ImageView {
    
    	private Matrix matrix;
    	private float startX;
    	private float startY;
    	private PointF pointerMidByEvent;
    	private float startDisByXY;
    
    	// 第一步:手指拖动图片
    	// 第二步:实现手指放大
    
    	public XImageView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    	}
    
    	public XImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		initParams();
    	}
    
    	public XImageView(Context context) {
    		super(context);
    	}
    
    	private void initParams() {
    		matrix = new Matrix();
    		// 设置默认
    		setImageMatrix(matrix);
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    		// 触摸手指数量
    		int pointerCount = event.getPointerCount();
    		System.out.println("event.getPointerCount() = "+event.getPointerCount());
    		if (pointerCount == 1) {
    			// 目前我们只是一个手指触摸(拖动图片)
    			switch (event.getAction()) {
    			case MotionEvent.ACTION_DOWN:
    				// 绝对位置 -- event.getRawX(); event.getRawY();
    				// 记录我们手指按下的时候的位置(相对位置)
    				startX = event.getX();
    				startY = event.getY();
    				break;
    			case MotionEvent.ACTION_MOVE:
    				// 当前手指触摸的位置
    				float x2 = event.getX();
    				float y2 = event.getY();
    
    				// dx,dy--增量 delta
    				matrix.postTranslate((x2 - startX), (y2 - startY));
    
    				setImageMatrix(matrix);
    
    				startX = x2;
    				startY = y2;
    				break;
    			case MotionEvent.ACTION_UP:
    
    				break;
    
    			default:
    				break;
    			}
    		} else if (event.getPointerCount() == 2) {
    			// 两个手指触摸放大(第二根手指触摸)
    			switch (event.getAction() & MotionEvent.ACTION_MASK) {
    			case MotionEvent.ACTION_POINTER_DOWN:
    				System.out.println("----pointerCount == 2-------");
    				// 获取两点之间的距离
    				startDisByXY = getDisByXY(event);
    				// 计算缩放的中心点坐标(开始触摸的时候中心点坐标)
    				pointerMidByEvent = getPointerMidByEvent(event);
    				break;
    			case MotionEvent.ACTION_MOVE:
    				// 当前触摸的两个手指之间的距离
    				float disByXY = getDisByXY(event);
    				// 计算放大的倍数
    				float scale = disByXY / startDisByXY;
    				System.out.println("pointerMidByEvent = "+pointerMidByEvent);
    				matrix.postScale(scale, scale, pointerMidByEvent.x,
    						pointerMidByEvent.y);
    				setImageMatrix(matrix);
    				break;
    
    			default:
    				break;
    			}
    		}
    		return super.onTouchEvent(event);
    	}
    
    	/**
    	 * 计算两点之间的中心点
    	 * 
    	 * @param event
    	 * @return
    	 */
    	private PointF getPointerMidByEvent(MotionEvent event) {
    		// 得到第一个手指的坐标
    		float x1 = event.getX();
    		float y1 = event.getY();
    		// 得到第二根手指触摸的位置
    		float x2 = event.getX(1);
    		float y2 = event.getY(1);
    		PointF pointF = new PointF();
    		pointF.x = (x1 + x2) / 2;
    		pointF.y = (y1 + y2) / 2;
    		return pointF;
    	}
    
    	/**
    	 * 计算两个手指直接的中心位置(缩放中心点)
    	 * 
    	 * 
    	 * @param event
    	 *            return value --- 两点之间的距离
    	 */
    	private float getDisByXY(MotionEvent event) {
    		// 得到第一个手指的坐标
    		float x1 = event.getX();
    		float y1 = event.getY();
    		// 得到第二根手指触摸的位置
    		float x2 = event.getX(1);
    		float y2 = event.getY(1);
    		// FloatMath.sqrt--开平方
    		return FloatMath.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    	}
    }
    

    MainActivity.java:

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    
    public class MainActivity extends Activity { 
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main); 
    	}
    }

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="${relativePackage}.${activityClass}" >
    
        <com.tz.dream.image.XImageView
            android:id="@+id/iv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"
            android:focusable="true"
            android:scaleType="matrix"
            android:src="@drawable/image_bg" />
    
    </RelativeLayout>

    整理自教程

    展开全文
  • 手势控制ImageView的缩放和移动,包内有五个demo,导入eclipse就能运行。
  • 移动ImageView,并且保存移动后的位置
  • imageView 放大 居中 左右移动
  • ImageView+Matrix移动问题

    2016-01-29 10:26:23
    1 背景:想使用ImageView+Matrix来实现图片的移动。 2 结果:1) 移动多次,每次都是从原来的位置进行移动,2) 移动之前ImageView的控件的位置并没有改变,图片在ImageView控件里面位置发生了变化 实现代码: ...
  • ImageView移动和缩放

    2016-11-17 19:07:04
    此demo是一个关于ImageView的平移缩放的,对图片的平移和缩放做了一定的限制,详情请浏览博客地址http://blog.csdn.net/u014452224/article/details/53200855
  • 手势控制ImageView的缩放和移动,包内有五个demo.
  • 手势缩放和移动ImageView
  • 手势控制ImageView的缩放和移动,包内有五个demo,导入eclipse就能运行。
  • MovingImageView自己移动imageview.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 主要介绍了基于Android实现随手指移动ImageView的相关资料,需要的朋友可以参考下
  • 该源码是一个实现跟随手指移动ImageView案例项目,源码TestImageMove,中心思想就是在activity的onTouchEvent(MotionEvent event)方法捕获事件,把事件分发到自定义的ImageView进行处理。
  • Android 自定义MutiTouchImageView (移动、缩放、旋转)
  • 安卓ImageView水平方向上随着手指来回移动
  • ImageView

    2016-11-15 23:20:38
    ImageView
  • 移动ImageView

    千次阅读 2015-05-11 18:21:38
    今天做了一个可移动ImageView,要点如下: 1 ontouch 2 ongloballayout 3 image放置适当的位置 4 matrix变换(平移,缩放) 代码很简单 activity_main.xml xmln
  • 需要实现一个需求,实现类似于ios的随重力而移动ImageView,要求较为简单:以宽度为基准,实现左右上下30dp范围内的随重力感应移动,图片高度如果小于控件高度,则上下不移动。 要实现这个功能,需要用到加速度...
  • 反击骗分进行到底!!! 拖拽ImageView,保存移动后的位置(永远作0积分下载) 拖拽ImageView,保存移动后的位置(永远作0积分下载) 拖拽ImageView,保存移动后的位置(永远作0积分下载)
  • 在项目中,需要在自定义的ImageView中的onTouchEvent设置背景,导致移动失效,回到原来的位置。 查找资料后,发现在设置背景前面,使用setLayoutParams方法可以解决。 代码: this.setLayoutParams(new ...
  • 最近遇到一个问题: 我们在显示一张图片时,需要的效果像: 使用ImageView需要固定宽高比,但给定图片的宽高比是不一样的,怎么使...ios方面:图片根据内容中心点移动位置: https://github.com/totemtec/UIImageV

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,090
精华内容 14,836
关键字:

imageview移动