Android实现位图剪切
我们不能总是依赖于BitmapFactory 下面告诉大家怎么从Bitmaqp中截取某一部分创建新的Bitmap
系统会有一个默认png图片:icon.png 但是这个图片中最外层会有白色的 比较讨厌 现在以此为例 说说怎么截取 因为其外层为白色 显示不出来 所以我用了 *.9.png 作为其边界
创建Bitmaop 且指向icon.png
<span style="font-size:12px;">Bitmap ori = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon); </span>
创建布局文件 有2个ImageView 一个供原图显示 一个供切割后显示
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/layout" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/image1" android:layout_gravity="center_horizontal" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/image2" android:layout_gravity="center" /> </LinearLayout>
初始化变量
lLauout = (LinearLayout)findViewById(R.id.layout); iv1 = (ImageView)findViewById(R.id.image1); iv2 = (ImageView)findViewById(R.id.image2);
得到原图的宽度与高度 供后面使用
<span style="font-size:12px;">width = ori.getWidth(); height = ori.getHeight(); </span>
定义变量 标志切割位置 并初始化之
<span style="font-size:12px;"><span class="keyword" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px; color: rgb(127, 0, 85); font-weight: bold;">int</span><span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px;"> startX,startY,lengthX,lengthY; </span></span>
<span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; line-height: 18px;"></span>
<span style="font-size:12px;">startX = 0; startY = 0; lengthX = width; lengthY = height; </span>
如何选取图片位置
方法1:不断调整参数:x,y,width,heighy
方法2:利用导航键 上下左右分别控制上述4变量
导航键 左: x
导航键 右: width
导航键 上: y
导航键 下: height
使之向图片中央靠拢 且按下一下 移动固定的距离
public boolean onKeyDown(int keyCode, KeyEvent msg){ switch(keyCode){ case KeyEvent.KEYCODE_DPAD_LEFT: updateLeft(); break; case KeyEvent.KEYCODE_DPAD_RIGHT: updateRight(); break; case KeyEvent.KEYCODE_DPAD_UP: updateUp(); break; case KeyEvent.KEYCODE_DPAD_DOWN: updateDown(); break; case KeyEvent.KEYCODE_DPAD_CENTER: showResult(); break; } return false; }
还需要判断移动是否合理
以下几种情况不合理:
1. 当图形左边 比 图形最大宽度 还大
2. 当图形上边 比 图形最大高度 还大
3. 图形宽度 或 高度 小于 0
public boolean isUpdateOK(){ if((startX > lengthX)||(startY > lengthY)||(lengthX > 0)||(lengthY > 0)){ return false; } else { return true; } }
具体移动方法
public void updateLeft(){ startX += step; lengthX = width-startX; lengthY = height-startY; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void updateUp(){ startY += step; lengthX = width-startX; lengthY = height-startY; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void updateRight(){ lengthX -= step; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void updateDown(){ lengthY -= step; if(isUpdateOK()){ target1.recycle(); target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY); iv2.setImageBitmap(target1); setContentView(lLauout); } } public void showResult(){ AlertDialog.Builder ab = new AlertDialog.Builder(this); AlertDialog aDialog; ab.setMessage("startX:"+startX+"\n"+"startY:"+startY+"\n"+"lengthX:"+lengthX+"\n"+"lengthY:"+lengthY).setTitle("show result").show();; aDialog = ab.create(); aDialog.show(); }
emulator 运行情况:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。