写道
Bitmap 创建
写道
我们不能总是依赖于BitmapFactory 下面告诉大家怎么从Bitmaqp中截取某一部分创建新的Bitmap
系统会有一个默认png图片:icon.png 但是这个图片中最外层会有白色的 比较讨厌 现在以此为例 说说怎么截取 因为其外层为白色 显示不出来 所以我用了 *.9.png 作为其边界
系统会有一个默认png图片:icon.png 但是这个图片中最外层会有白色的 比较讨厌 现在以此为例 说说怎么截取 因为其外层为白色 显示不出来 所以我用了 *.9.png 作为其边界
[代码 步骤]
1. 创建Bitmaop 且指向icon.png
- Bitmap ori = BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);
Bitmap ori = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);
2. 创建布局文件 有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 >
3. 初始化变量
- lLauout = (LinearLayout)findViewById(R.id.layout);
- iv1 = (ImageView)findViewById(R.id.image1);
- iv2 = (ImageView)findViewById(R.id.image2);
lLauout = (LinearLayout)findViewById(R.id.layout);
iv1 = (ImageView)findViewById(R.id.image1);
iv2 = (ImageView)findViewById(R.id.image2);
4. 得到原图的宽度与高度 供后面使用
- width = ori.getWidth();
- height = ori.getHeight();
width = ori.getWidth();
height = ori.getHeight();
5. 定义变量 标志切割位置 并初始化之
- int startX,startY,lengthX,lengthY;
int startX,startY,lengthX,lengthY;
- startX = 0 ;
- startY = 0 ;
- lengthX = width;
- lengthY = height;
startX = 0;
startY = 0;
lengthX = width;
lengthY = height;
6. 如何选取图片位置
写道
函数原型: Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)
方法1:不断调整参数:x,y,width,heighy
方法2:利用导航键 上下左右分别控制上述4变量
导航键 左: x
导航键 右: width
导航键 上: y
导航键 下: height
使之向图片中央靠拢 且按下一下 移动固定的距离
方法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 ;
- }
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;
}
7. 还需要判断移动是否合理
- 以下几种情况不合理:
- 1 . 当图形左边 比 图形最大宽度 还大
- 2 . 当图形上边 比 图形最大高度 还大
- 3 . 图形宽度 或 高度 小于 0
以下几种情况不合理:
1. 当图形左边 比 图形最大宽度 还大
2. 当图形上边 比 图形最大高度 还大
3. 图形宽度 或 高度 小于 0
- public boolean isUpdateOK(){
- if ((startX > lengthX)||(startY > lengthY)||(lengthX > 0 )||(lengthY > 0 )){
- return false ;
- }
- else {
- return true ;
- }
- }
public boolean isUpdateOK(){
if((startX > lengthX)||(startY > lengthY)||(lengthX > 0)||(lengthY > 0)){
return false;
}
else {
return true;
}
}
8. 具体移动方法:
- 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();
- }
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();
}
9. emulator 运行情况:
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。