本文实例为大家分享了Android实现手势划定区域裁剪图片的具体代码,供大家参考,具体内容如下

需求:

拍照,然后对图片进行处理,划定矩形区域,将矩形区域裁剪下来

思路:

1、使用系统相机拍照,拍完返回,对图片进行压缩和存储。

2、新建一个activity处理图片裁剪,利用自定义view在画布上画出矩形区域。

3、根据坐标信息生成裁剪图片并存储。

部分核心代码:

1、调用系统相机拍照

String IMAGE_PATH = Environment.getExternalStorageDirectory().getPath()  "/com.kwmax.demo/Image/";
String filename = "xxxxxx.jpeg";
File picFile = new File(IMAGE_PATH   filename);
if (!picFile.exists()) {
    picFile.createNewFile();
}
 
...
if(getContext().getPackageManager().getLaunchIntentForPackage("com.sec.android.app.camera") != null) {
    cameraIntent.setPackage("com.sec.android.app.camera");
}
if (getContext().getPackageManager().getLaunchIntentForPackage("com.android.hwcamera") != null) {
    cameraIntent.setPackage("com.android.hwcamera");
}
if (getContext().getPackageManager().getLaunchIntentForPackage("com.zte.camera") != null) {
    cameraIntent.setPackage("com.zte.camera");
}
cameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 默认系统相机
cameraIntent.addCategory("android.intent.category.DEFAULT");
 
Uri pictureUri = Uri.fromFile(picFile);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri);
startActivityForResult(intent, CAMERA_REQUEST_CODE);

2、自定义手势矩形view

public class CaptureRectView extends View {
    private int x;
    private int y;
    private int m;
    private int n;
    private boolean sign;//绘画标记位
    private Paint paint;//画笔
 
    public CaptureRectView (Context context) {
        super(context);
        paint = new Paint(Paint.FILTER_BITMAP_FLAG);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        if(sign){
            paint.setColor(Color.TRANSPARENT);
        }else{
            paint.setColor(Color.RED);
            paint.setAlpha(80);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(15f);
            canvas.drawRect(new Rect(x, y, m, n), paint);
        }
        super.onDraw(canvas);
    }
 
    public void setSeat(int x,int y,int m,int n){
        this.x = x;
        this.y = y;
        this.m = m;
        this.n = n;
    }
 
    public boolean isSign() {
        return sign;
    }
 
    public void setSign(boolean sign) {
        this.sign = sign;
    }
}

3、裁剪页面布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@ id/drawrect_framelayout"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@color/black"
                android:clickable="true"
                android:orientation="vertical">
 
    <RelativeLayout
        android:id="@ id/drawrect_relativelayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/black"
        android:orientation="vertical">
 
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@ id/bottom">
            <LinearLayout
                android:id="@ id/image_zoom_view_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:orientation="vertical"/>
            <ImageView
                android:id="@ id/capture_preview"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
        </FrameLayout>

        <LinearLayout
            android:id="@ id/bottom"
            android:layout_width="fill_parent"
            android:layout_height="50dip"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp">
 
            <Button
                android:id="@ id/btn_capture"
                android:layout_width="50dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_marginRight="10dp"
                android:text="裁剪"/>
 
            <Button
                android:id="@ id/btn_cancel"
                android:layout_width="50dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="取消"/>
 
        </LinearLayout>
 
    </RelativeLayout>
 
</FrameLayout>

4、裁剪activity

public class DrawRectActivity extends BasicActivity implements OnClickListener, View.OnTouchListener {
 
    private String TAG = "DrawRectActivity";
    private String imageString;
    private String imagePath;
    private ArrayList<String> imageList = null;
    private int position = 0;
    private int width, height;
    private LinearLayout layerViewLayout = null;
 
    private ImageView aiPreview;
    private CaptureRectView captureView;//绘画选择区域
    private int capX;//绘画开始的横坐标
    private int capY;//绘画开始的纵坐标
    private int capM;//绘画结束的横坐标
    private int capN;//绘画结束的纵坐标
    private Bitmap captureBitmap;
 
    private Button cancel;
    private Button aiCapture;
 
    private FrameLayout frameLayout;
    private RelativeLayout relativeLayout;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
        initUI();
    }
 
    private void init() {
        width = ImageUtils.getScreenWidth(this);
        height = ImageUtils.getScreenHeight(this);
        Intent intent = this.getIntent();
        Bundle bundle = intent.getExtras();
        imageString = bundle.getString("imageString");
        imagePath = bundle.getString("imagePath");
        position = bundle.getInt("position");
        imageList = parseImageString(imagePath, imageString);
 
    }
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void initUI() {
        setContentView(R.layout.draw_image_rect_view);
        frameLayout = (FrameLayout) findViewById(R.id.drawrect_framelayout);
        relativeLayout = (RelativeLayout) findViewById(R.id.drawrect_relativelayout);
        layerViewLayout = (LinearLayout) this.findViewById(R.id.image_zoom_view_layout);
        btncancel = (Button) findViewById(R.id.btn_cancel);
        btnCapture = (Button) findViewById(R.id.btn_capture);
        btnPreview = (ImageView) findViewById(R.id.capture_preview);
 
        ImageView originImage = new ImageView(this);
        Bitmap image = ImageUtils.getBitmapFromFile(imagePath   imageList.get(position), 1);
        originImage.setImageBitmap(image);
        originImage.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        layerViewLayout.addView(originImage, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
 
        captureView = new CaptureRectView(this);
        originImage.setOnTouchListener(this);
        this.addContentView(captureView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
 
        if (frameLayout.isClickable()) {
            frameLayout.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                }
            });
        }
        btncancel.setOnClickListener(this);
        btnCapture.setOnClickListener(this);
 
    }
 
    private ArrayList<String> parseImageString(String imagePath, String imageString) {
        ArrayList<String> list = new ArrayList<String>();
        String allFiles = imageString.substring(imageString.indexOf("img://")   "img://".length());
        String fileName = null;
        while (allFiles.indexOf(";") > 0) {
            fileName = allFiles.substring(0, allFiles.indexOf(";"));
            allFiles = allFiles.substring(allFiles.indexOf(";")   1);
            if (checkIsImageFile(fileName) && new File(imagePath   fileName).exists()) {
                list.add(fileName);
                Log.v("ParseImageString()", "imageName="   fileName);
            } else {
                Log.v("ParseImageString()", "bad imageName="   fileName);
            }
 
        }
        Log.v("ParseImageString()", "imagelist.size="   list.size());
        return list;
    }
 
    /**
     * 判断是否相应的图片格式
     */
    private boolean checkIsImageFile(String fName) {
        boolean isImageFormat;
        if (fName.endsWith(".jpg") || fName.endsWith(".gif") || fName.endsWith(".png") || fName.endsWith(".jpeg") || fName.endsWith(".bmp")) {
            isImageFormat = true;
        } else {
            isImageFormat = false;
        }
        return isImageFormat;
    }
 
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                capX = 0;
                capY = 0;
                width = 0;
                height = 0;
                capX = (int) event.getX();
                capY = (int) event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                capM = (int) event.getX();
                capN = (int) event.getY();
                captureView.setSeat(capX, capY, capM, capN);
                captureView.postInvalidate();
                break;
            case MotionEvent.ACTION_UP:
                if (event.getX() > capX) {
                    width = (int) event.getX() - capX;
                } else {
                    width = (int) (capX - event.getX());
                    capX = (int) event.getX();
                }
                if (event.getY() > capY) {
                    height = (int) event.getY() - capY;
                } else {
                    height = (int) (capY - event.getY());
                    capY = (int) event.getY();
                }
                captureBitmap = getCapturePreview(this);
                if (null != captureBitmap) {
                    btnPreview.setImageBitmap(captureBitmap);
                }
                break;
        }
        if (captureView.isSign()) {
            return false;
        } else {
            return true;
        }
    }
 
    private Bitmap getCapturePreview(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int toHeight = frame.top;
        //todo:这里需要针对部分机型做适配
        if (width > 0 && height > 0) {
            bitmap = Bitmap.createBitmap(bitmap, capX, capY   240, width, height);
            view.setDrawingCacheEnabled(false);
            return bitmap;
        } else {
            return null;
        }
    }
 
    @Override
    public void onClick(View v) {
 
        switch (v.getId()) {
            case R.id.btn_cancel:
                Intent cancelintent = getIntent();
                createPendingResult(600, cancelintent, PendingIntent.FLAG_UPDATE_CURRENT);
                setResult(RESULT_OK, cancelintent);
                finish();
                break;
            case R.id.btn_capture:
                Intent sureintent = getIntent();
                createPendingResult(CpAIphotoAttributes.PHOTO_CAPTURE, sureintent, PendingIntent.FLAG_UPDATE_CURRENT);
                if (captureBitmap != null) {                  
                    try {
                        String file = IMAGE_PATH;
                        String randomid = UUID.randomUUID().toString();
                        String filename = randomid  ".jpeg";
                        FileOutputStream fout = new FileOutputStream(file filename);
                        captureBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout);
                        sureintent.putExtra("capturePath", file filename);
                        sureintent.putExtra("capturefilename", filename);
                        sureintent.putExtra("capturefileid", randomid);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                setResult(RESULT_OK, sureintent);
                finish();
                break;
            default:
                break;
        }
    }
 
 
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                Intent cancelintent = getIntent();
                createPendingResult(600, cancelintent, PendingIntent.FLAG_UPDATE_CURRENT);
                cancelintent.putExtra("imagePath", imagePath);
                cancelintent.putExtra("position", position);
                cancelintent.putExtra("todowhat", "cancel");
                setResult(RESULT_OK, cancelintent);
                finish();
                break;
            default:
                break;
        }
        return false;
    }
 
    @Override
    public void finish() {
        super.finish();
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case 400:
                    String text = null;
                    Log.v("DrawRectActivity", "onActivityReault imagePath="   imagePath   imageList.get(position));
                    if (StringUtil.isNotBlank(text)) {
                        Log.v("DrawRectActivity", "onActivityReault imagePath="   imagePath   imageList.get(position)   ";text="   text);
                    } else {
 
                    }
                    break;
                default:
                    break;
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Android实现手势划定区域裁剪图片的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Pan和2 Finger Pinch同步iOS – 同时 –

    2手势识别器:和:但同时捏和平底锅不起作用……

  6. ios – 视图的简单拖放?

    我正在学习iOS,但我找不到如何向UIView添加拖放行为.我试过了:它说“UIView没有可见的接口声明选择器addTarget”此外,我尝试添加平移手势识别器,但不确定这是否是我需要的它被称为,但不知道如何获得事件的坐标.在iOS中注册移动事件回调/拖放操作的标准简单方法是什么?

  7. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  8. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  9. ios – UINavigationController自定义动画可防止滑动返回工作

    我注意到一些奇怪的东西,可能是UINavigationController中的一个错误.当你覆盖-navigationController:animationControllerForOperation:fromViewController:toViewController:并返回nil(对于默认的动画行为),拖放回去的手势不再有效.此方法的文档说明如果要使用标准导航控制器转换,则应返回“nil”

  10. ios – UITableView滑动手势与UITableViewCell滑动冲突

    以下是我编写的用于在UITableView上放置2个手指滑动的代码:我正在使用SWTableViewCell左右(单击)gestureRecognisers.当使用2个手指向左/向右滑动UITableView时,SWTableViewCell左右手势也会在此之后被触发.如何制止冲突?解决方法当您触摸SWTableViewCell时,将BOOLSWTableViewCellTouch设置为YES.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部