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

Android实现bitmap指定区域滑动截取功能,第1张

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

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

先上效果图:

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

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

界面layout:

<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"  xmlns:app="http://schemas.androID.com/apk/res-auto"  xmlns:tools="http://schemas.androID.com/tools"  androID:layout_wIDth="match_parent"  androID:layout_height="match_parent"  tools:context="com.admin.myapplication.MainActivity">  <com.admin.myapplication.ScreenShotVIEw    androID:ID="@+ID/screenShotVIEw"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"/>  <linearLayout    androID:ID="@+ID/Title"    androID:layout_wIDth="match_parent"    androID:layout_height="30dp"    androID:background="#000000">    <TextVIEw      androID:layout_wIDth="match_parent"      androID:layout_height="20dp"      androID:layout_gravity="center"      androID:gravity="center"      androID:text="选择要截取区域"/>  </linearLayout>  <linearLayout    androID:ID="@+ID/bottom"    androID:layout_wIDth="match_parent"    androID:layout_height="70dp"    androID:layout_alignParentBottom="true"    androID:background="#000000"    androID:orIEntation="horizontal">    <TextVIEw      androID:ID="@+ID/cancel_btn"      androID:text="取消"      androID:layout_wIDth="0dp"      androID:layout_height="wrap_content"      androID:layout_weight="1"      androID:layout_gravity="center_vertical"      androID:gravity="center"/>    <TextVIEw      androID:ID="@+ID/certain_btn"      androID:text="确定"      androID:layout_wIDth="0dp"      androID:layout_height="wrap_content"      androID:layout_weight="1"      androID:layout_gravity="center_vertical"      androID:gravity="center"/>    <TextVIEw      androID:ID="@+ID/restart_btn"      androID:text="重试"      androID:layout_wIDth="0dp"      androID:layout_height="wrap_content"      androID:layout_weight="1"      androID:layout_gravity="center_vertical"      androID:gravity="center"/>  </linearLayout></relativeLayout>

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,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(),paintShadow);  }  private voID drawShadowleft(Canvas canvas) {    paintShadow = new Paint();    paintShadow.setcolor(shadow);    canvas.drawRect(0,lefttopDot.getX(),paintShadow);  }  private voID drawShadowtop(Canvas canvas) {    paintShadow = new Paint();    paintShadow.setcolor(shadow);    canvas.drawRect(0,paintShadow);  }  private voID drawBitmap(Canvas canvas) {    Paint paint = new Paint();    canvas.drawBitmap(mBitmap,paint);  }  /**   * 画出截图区域   *   * @param canvas   */  private voID drawArea(Canvas canvas) {    Paint paint = new Paint();    paint.setcolor(clear);    canvas.drawRect(lefttopDot.getX(),rightBottomDot.getX(),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,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,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提取并存储在单例中,在下一个页面再调用。

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

总结

以上是内存溢出为你收集整理的Android实现bitmap指定区域滑动截取功能全部内容,希望文章能够帮你解决Android实现bitmap指定区域滑动截取功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144362.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存