Android: 照片选择区域功能实现

实现 Android 的照片选择区域功能

WechatIMG1.png

主要有参考 pqpo/SmartCropper

1, 显示

显示四条边和八个点,

八个点: 4 个角和 4 条边的中点

/* 裁剪区域,
0, 左上 -> LeftTop, 
1, 右上 -> RightTop,
2, 右下 -> RightBottom, 
3, 左下 -> LeftBottom
*/
Point[] mCropPoints; 

// 4 条边的中点
Point[] mEdgeMidPoints; 

绘制

    protected void onDrawCropPoint(Canvas canvas) {
        //绘制蒙版
        onDrawMask(canvas);
        //绘制辅助线
        onDrawGuideLine(canvas);
        //绘制选区线
        onDrawLines(canvas);
        //绘制锚点
        onDrawPoints(canvas);
        //绘制放大镜
        // ...
    }


具体绘制部分:

绘制八个点


protected void onDrawPoints(Canvas canvas) {
        if (!checkPoints(mCropPoints)) {
            return;
        }
        // 绘制 4 个角
        for (Point point : mCropPoints) {
            canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointFillPaint);
            canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointPaint);
        }
        if (mShowEdgeMidPoint) {
            setEdgeMidPoints();
            // 中间锚点
            // 绘制 4 条边上的中点
            for (Point point : mEdgeMidPoints){
                canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointFillPaint);
                canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointPaint);
            }
        }
    }

绘制 4 条边上的中点前,

先算出当前 4 条边上中点的位置

     public void setEdgeMidPoints(){
        // 中点不存在,就新建
        if (mEdgeMidPoints == null){
            mEdgeMidPoints = new Point
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Android中的GestureDetector类和ScaleGestureDetector类来实现双指照片放大指定区域功能。 首先,你需要在XML布局文件中添加一个ImageView,然后在Java代码中获取该ImageView的实例: ```java ImageView imageView = findViewById(R.id.image_view); ``` 然后,你需要创建一个GestureDetector和一个ScaleGestureDetector实例: ```java GestureDetector gestureDetector = new GestureDetector(this, new MyGestureListener()); ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(this, new MyScaleGestureListener()); ``` 注意,MyGestureListener和MyScaleGestureListener是自定义的GestureListener和ScaleGestureListener类,它们用来处理手势事件。接下来,你需要将这两个实例与ImageView关联起来: ```java imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { gestureDetector.onTouchEvent(event); scaleGestureDetector.onTouchEvent(event); return true; } }); ``` 现在,你需要在MyGestureListener和MyScaleGestureListener类中实现相应的方法来处理手势事件。以下是一个示例实现: ```java private class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { // 双击事件 return true; } } private class MyScaleGestureListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { private float scaleFactor = 1.0f; @Override public boolean onScale(ScaleGestureDetector detector) { scaleFactor *= detector.getScaleFactor(); scaleFactor = Math.max(1.0f, Math.min(scaleFactor, 3.0f)); // 最大缩放比例为3 imageView.setScaleX(scaleFactor); imageView.setScaleY(scaleFactor); return true; } } ``` 在这个示例中,双击事件被处理为放大到最大缩放比例。而onScale()方法用于处理缩放事件。scaleFactor变量记录当前缩放比例,每次缩放事件都会更新scaleFactor,然后将其应用到ImageView上。 如果你想要实现双指放大指定区域的效果,你需要在onScale()方法中计算缩放区域的坐标,并将其应用到ImageView上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值