热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现bitmap指定区域滑动截取功能

这篇文章主要为大家详细介绍了Android实现bitmap指定区域滑动截取功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

突然不知道什么心态,说要做这个,网上找了半天没找到合适的,就自己做了一个。

先上效果图:

透明区域为将要截取的区域,其他阴影部位为舍弃区域

图片资源我写死储存在了raw中,有需要可以自己写获取bitmap。

界面layout:


  
  
    
  
  
    
    
    
  



ScreenShotView为自定义View用来显示bitmap,以及滑动截图,其中Dot类用来储存坐标点的x,y值。

public class ScreenShotView extends View {
  private Dot startDot;
  private Dot endDot;
  private Bitmap mBitmap;
  private Bitmap ocrBitmap;
  private int screenHeight;
  private int screenWidth;
  private Dot leftTopDot;
  private Dot rightBottomDot;
  private Paint paintShadow;
  int shadow = 0xaa000000;
  int clear = 0x0000000;


  public ScreenShotView(Context context) {
    super(context);
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
  }

  public ScreenShotView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
  }

  public ScreenShotView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
  }

  public void setBitmap(Bitmap bitmap, int screenHeight, int screenWidth) {
    mBitmap = bitmap;
    this.screenHeight = screenHeight;
    this.screenWidth = screenWidth;
    changeBitmapSize();
    invalidate();
  }

  public void restart(){
    startDot = new Dot();
    endDot = new Dot();
    leftTopDot = new Dot();
    rightBottomDot = new Dot();
    invalidate();
  }
  /**
  *将将要显示的bitmap进行变形,使其铺满屏幕
  *
  */
  private void changeBitmapSize() {
    int width = mBitmap.getWidth();
    int height = mBitmap.getHeight();
    float scaleWidth = ((float) screenWidth) / width;
    float scaleHeight = ((float) screenHeight) / height;
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, width, height, matrix, true);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    getLeftTopDot();
    getRightBottomDot();
    drawBitmap(canvas);
    drawArea(canvas);
    drawShadowTop(canvas);
    drawShadowLeft(canvas);
    drawShadowRight(canvas);
    drawShadowBottom(canvas);
  }

  /**
  *绘制阴影
  *
  */
  private void drawShadowBottom(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(0, rightBottomDot.getY(), screenWidth, screenHeight, paintShadow);
  }

  private void drawShadowRight(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(rightBottomDot.getX(), leftTopDot.getY(), screenWidth, rightBottomDot.getY(), paintShadow);
  }

  private void drawShadowLeft(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(0, leftTopDot.getY(), leftTopDot.getX(), rightBottomDot.getY(), paintShadow);
  }

  private void drawShadowTop(Canvas canvas) {
    paintShadow = new Paint();
    paintShadow.setColor(shadow);
    canvas.drawRect(0, 0, screenWidth, leftTopDot.getY(), paintShadow);
  }

  private void drawBitmap(Canvas canvas) {
    Paint paint = new Paint();
    canvas.drawBitmap(mBitmap, 0, 0, paint);
  }

  /**
   * 画出截图区域
   *
   * @param canvas
   */
  private void drawArea(Canvas canvas) {
    Paint paint = new Paint();
    paint.setColor(clear);
    canvas.drawRect(leftTopDot.getX(), leftTopDot.getY(), rightBottomDot.getX(), rightBottomDot.getY(), paint);
  }


  /**
   * 获取截图区域bitmap
   *
   * @return 截图
   */
  public Bitmap getBitmap() {
    if (mBitmap != null) {
      getLeftTopDot();
      getRightBottomDot();
      if (getBitmapOutWidth() > 0 && getBitmapOutHeight() > 0) {
        if(leftTopDot.getY()<0){
          leftTopDot.setY(0);
        }
        ocrBitmap = Bitmap.createBitmap(mBitmap, (int) leftTopDot.getX(), (int) leftTopDot.getY(), getBitmapOutWidth(), getBitmapOutHeight());
      }
    }
    return ocrBitmap;
  }

  /**
   * 获取截图区域宽度
   *
   * @return
   */
  private int getOutWidth() {
    return (int) (rightBottomDot.getX() - leftTopDot.getX());
  }

  /**
   * 获取截图区域高度
   *
   * @return
   */
  private int getOutHeight() {
    return (int) (rightBottomDot.getY() - leftTopDot.getY());
  }

  private int getBitmapOutWidth() {
    int bitmapOutWidth;
    int scale = getOutWidth() * mBitmap.getWidth();
    bitmapOutWidth = scale / screenWidth;
    return bitmapOutWidth;
  }

  private int getBitmapOutHeight() {
    int bitmapOutHeight;
    int scale = getOutHeight() * mBitmap.getHeight();
    bitmapOutHeight = scale / screenHeight;
    return bitmapOutHeight;
  }

  private void getLeftTopDot() {
    if (endDot.getX() > startDot.getX()) {
      leftTopDot.setX(startDot.getX());
    } else {
      leftTopDot.setX(endDot.getX());
    }
    if (endDot.getY() > startDot.getY()) {
      leftTopDot.setY(startDot.getY());
    } else {
      leftTopDot.setY(endDot.getY());
    }
  }

  private void getRightBottomDot() {
    if (startDot.getX() > endDot.getX()) {
      rightBottomDot.setX(startDot.getX());
    } else {
      rightBottomDot.setX(endDot.getX());
    }
    if (startDot.getY() > endDot.getY()) {
      rightBottomDot.setY(startDot.getY());
    } else {
      rightBottomDot.setY(endDot.getY());
    }

  }

  public Dot getStartDot() {
    return startDot;
  }

  public void setStartDot(Dot startDot) {
    this.startDot = startDot;
  }

  public Dot getEndDot() {
    return endDot;
  }

  public void setEndDot(Dot endDot) {
    this.endDot = endDot;
  }

}

MainActivity中完成对点击滑动的监控,通过坐标点的方式获得需要绘制的矩形位置和形状。

public class MainActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {
  private ScreenShotView screenShotView;
  private Bitmap bmp;
  private Bitmap ocrBitmap;
  private TextView certainBtn;
  private TextView cancelBtn;
  private TextView restartBtn;
  private int screenWidth;
  private int screenHeight;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    screenShotView = (ScreenShotView) findViewById(R.id.screenShotView);
    cancelBtn = (TextView) findViewById(R.id.cancel_btn);
    cancelBtn.setOnClickListener(this);
    certainBtn = (TextView) findViewById(R.id.certain_btn);
    certainBtn.setOnClickListener(this);
    restartBtn = (TextView)findViewById(R.id.restart_btn);
    restartBtn.setOnClickListener(this);
    DisplayMetrics dm = new DisplayMetrics();
    //获取屏幕信息
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    screenWidth = dm.widthPixels;
    screenHeight = dm.heightPixels;
    Resources r = this.getResources();
    InputStream is = r.openRawResource(R.raw.bg);
    BitmapDrawable bmpDraw = new BitmapDrawable(is);
    bmp = bmpDraw.getBitmap();
    screenShotView.setBitmap(bmp, screenHeight, screenWidth);
    screenShotView.setOnTouchListener(this);
  }

  @Override
  public boolean onTouch(View view, MotionEvent motionEvent) {
    switch (motionEvent.getAction()) {
      case MotionEvent.ACTION_DOWN:
        screenShotView.setStartDot(new Dot(motionEvent.getX(), motionEvent.getY()));
        break;
      case MotionEvent.ACTION_MOVE:
        screenShotView.setEndDot(new Dot(motionEvent.getX(), motionEvent.getY()));
        screenShotView.setBitmap(bmp, screenHeight, screenWidth);
        break;
      case MotionEvent.ACTION_UP:
        ocrBitmap = screenShotView.getBitmap();
        break;
    }
    return true;
  }

  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.cancel_btn:
        finish();
        break;
      case R.id.certain_btn:
        if (ocrBitmap != null) {
          BitmapUtil.getInstance().setImageBitmap(ocrBitmap);
          Intent intent = new Intent(MainActivity.this, Main2Activity.class);
          startActivity(intent);
        }else{
          Toast.makeText(MainActivity.this,"请选择截取区域",Toast.LENGTH_SHORT).show();
        }
        break;
      case R.id.restart_btn:
        screenShotView.restart();
        break;
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    screenShotView.restart();
  }

  @Override
  protected void onRestart() {
    super.onRestart();
    screenShotView.restart();
  }
}

运用了单例模式用来存储截取出来的bitmap,方便跳转时调用,不需要自己再写类,点击确定后,会将区域中的bitmap提取并存储在单例中,在下一个页面再调用。

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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
author-avatar
用户rmgq8prdxo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有