突然不知道什么心态,说要做这个,网上找了半天没找到合适的,就自己做了一个。
先上效果图:
透明区域为将要截取的区域,其他阴影部位为舍弃区域
图片资源我写死储存在了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指定区域滑动截取功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)