您的位置:首页 > 移动开发 > Android开发

android长按实现放大镜功能,此源码为转载个人加了一些,留待以后查看

2016-07-16 15:00 435 查看
该文章里引用的代码是别人给我的,所以没有原博主链接,如果有哪位看官知道可以通知我加上哈。

 

ImageMagnifier.java文件

package com.example.magnifier;

import java.util.Timer;

import java.util.TimerTask;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapShader;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.PointF;

import android.graphics.Shader;

import android.os.Handler;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.WindowManager;

import android.view.animation.Animation;

import android.view.animation.ScaleAnimation;

import android.widget.ImageView;

/**

 * Created by noman on 9/14/15.

 */

public class ImageMagnifier extends ImageView {

    private PointF zoomPos;

    private boolean zooming = false;

    private Matrix matrix;

    private Paint paint;

    private Bitmap bitmap;

    private BitmapShader shader;

    private int sizeOfMagnifier = 200; //绘制圆形半径

    private boolean isMoved;

    private boolean isReleased;

    private boolean isDown;

    private boolean FromDown;

    private static final int TOUCH_SLOP = 20;  //判断手指滑动范围,超出该范围人为滑动

    private int mLastMotionX, mLastMotionY;

    private int mCount=0;

    

    

    

    public ImageMagnifier(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        init();

    }

    public ImageMagnifier(Context context, AttributeSet attrs) {

        super(context, attrs);

        init();

    }

     

    private void init() {

        zoomPos = new PointF(0, 0);

        matrix = new Matrix();

        paint = new Paint();

    }

 

    @Override

    public boolean onTouchEvent(MotionEvent event) {

        int action = event.getAction();

        Runnable mImageMagnifier = new Runnable() {   //处理在延迟1秒的过程中手指有没有抬起或滑动,没有的话认为长按1秒

            @Override 

            public void run() {  

             mCount--;

             if(mCount>0||isMoved||isReleased)return; 

             Log.i("czk", "qwe");

             FromDown=true;

             zooming = true;

                invalidate();

            }  

        };

        zoomPos.x = event.getX();

        zoomPos.y = event.getY();

       int x = (int)event.getX();

       int y = (int)event.getY();

        switch (action) {

            case MotionEvent.ACTION_DOWN:

             mCount++;

             mLastMotionX=x;

             mLastMotionY=y;

             isDown=true;

             isReleased = false;  

                isMoved = false;

                postDelayed(mImageMagnifier,1000);  //延迟1秒

             break;

       

            case MotionEvent.ACTION_MOVE:

             if( Math.abs(mLastMotionX-x) > TOUCH_SLOP   

                        || Math.abs(mLastMotionY-y) > TOUCH_SLOP ) {  

                    //移动超过阈值,则表示移动了  

                    isMoved = true;  

                    removeCallbacks(mImageMagnifier);  

                }  

                if(FromDown){

                 zooming = true;

                    this.invalidate();

                }

                break;

            case MotionEvent.ACTION_UP:

            case MotionEvent.ACTION_CANCEL:

             isReleased=true;

             isDown=false; 

             FromDown=false;

                zooming = false;

                this.invalidate();

                removeCallbacks(mImageMagnifier);

                break;

            default:

                break;

        }

   

       return true;

     

       

    }

    @Override

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

    

        if (!zooming) {

            buildDrawingCache();

        } else if(mCount==0&&zooming){

       

         WindowManager wm = (WindowManager) getContext()

                    .getSystemService(Context.WINDOW_SERVICE);

 

               int width = wm.getDefaultDisplay().getWidth();

               int height = wm.getDefaultDisplay().getHeight();

            bitmap = getDrawingCache();

            shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

            paint = new Paint();

            paint.setShader(shader);

            matrix.reset();

            matrix.postScale(2.5f, 2.5f, zoomPos.x, zoomPos.y);

            paint.getShader().setLocalMatrix(matrix);

          //  canvas.drawCircle(zoomPos.x, zoomPos.y, sizeOfMagnifier, paint);

           

            if(zoomPos.x<sizeOfMagnifier){  //放大镜边界越界处理

             if(zoomPos.y<sizeOfMagnifier*2){

              canvas.drawCircle(sizeOfMagnifier, sizeOfMagnifier, sizeOfMagnifier, paint);

;

             }else if(zoomPos.y>(height-sizeOfMagnifier)){

              canvas.drawCircle(sizeOfMagnifier, zoomPos.y-sizeOfMagnifier, sizeOfMagnifier, paint);

             }else{

              canvas.drawCircle(sizeOfMagnifier, zoomPos.y-sizeOfMagnifier, sizeOfMagnifier, paint);

             }

            }else if(zoomPos.x>(width-sizeOfMagnifier)){

             if(zoomPos.y<sizeOfMagnifier*2){

              canvas.drawCircle(width-sizeOfMagnifier, sizeOfMagnifier, sizeOfMagnifier, paint);

             }else if(zoomPos.y>(height-sizeOfMagnifier)){

              canvas.drawCircle(width-sizeOfMagnifier, zoomPos.y-sizeOfMagnifier, sizeOfMagnifier, paint);

             }else{

              canvas.drawCircle(width-sizeOfMagnifier, zoomPos.y-sizeOfMagnifier, sizeOfMagnifier, paint);

             }

            }else{

             if(zoomPos.y<sizeOfMagnifier*2){

              canvas.drawCircle(zoomPos.x, sizeOfMagnifier, sizeOfMagnifier, paint);

             }else if(zoomPos.y>(height-sizeOfMagnifier)){

              canvas.drawCircle(zoomPos.x, zoomPos.y-sizeOfMagnifier, sizeOfMagnifier, paint);

             }else{

              canvas.drawCircle(zoomPos.x, zoomPos.y-sizeOfMagnifier, sizeOfMagnifier, paint);

             }

            }

        }

       

    }

}

MainActivity.java文件

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  requestWindowFeature(Window.FEATURE_NO_TITLE);

  setContentView(R.layout.activity_main);

 }
activity_main.xml文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/container"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="com.example.magnifier.MainActivity"

    tools:ignore="MergeRootFrame" >

 <com.example.magnifier.ImageMagnifier

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:scaleType="fitXY"     //图片全屏
        android:src="@drawable/max"  //对应的图片资源

/>

</FrameLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: