Bitmap 相关2:Bitmap.createBitmap() 使用(转)

写道

 Bitmap 创建

 

写道
我们不能总是依赖于BitmapFactory 下面告诉大家怎么从Bitmaqp中截取某一部分创建新的Bitmap

系统会有一个默认png图片:icon.png 但是这个图片中最外层会有白色的 比较讨厌 现在以此为例 说说怎么截取 因为其外层为白色 显示不出来 所以我用了 *.9.png 作为其边界

 

 

 

[代码 步骤]

1. 创建Bitmaop 且指向icon.png

Java代码
  1. Bitmap ori = BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);  
Bitmap ori = BitmapFactory.decodeResource(this.getResources(), R.drawable.icon);

 

 

2. 创建布局文件 有2个ImageView 一个供原图显示 一个供切割后显示

Xml代码
  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2. < LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"   
  3.     android:orientation = "vertical"   
  4.     android:layout_width = "fill_parent"   
  5.     android:layout_height = "fill_parent"   
  6.     android:id = "@+id/layout"   
  7.     >   
  8. < ImageView     
  9.     android:layout_width = "wrap_content"    
  10.     android:layout_height = "wrap_content"    
  11.     android:id = "@+id/image1"   
  12.     android:layout_gravity = "center_horizontal"   
  13.     />   
  14. < ImageView     
  15.     android:layout_width = "wrap_content"    
  16.     android:layout_height = "wrap_content"    
  17.     android:id = "@+id/image2"   
  18.     android:layout_gravity = "center"   
  19.     />   
  20. </ LinearLayout >   

 

 

3. 初始化变量

Java代码
  1. lLauout = (LinearLayout)findViewById(R.id.layout);  
  2.           
  3. iv1 = (ImageView)findViewById(R.id.image1);  
  4. 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. 得到原图的宽度与高度 供后面使用

Java代码
  1. width = ori.getWidth();  
  2. height = ori.getHeight();  
width = ori.getWidth();
height = ori.getHeight();

 

5.  定义变量 标志切割位置 并初始化之

Java代码
  1. int  startX,startY,lengthX,lengthY;  
int startX,startY,lengthX,lengthY;

 

Java代码
  1. startX =  0 ;  
  2. startY = 0 ;  
  3.   
  4. lengthX = width;  
  5. 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

使之向图片中央靠拢 且按下一下 移动固定的距离

 

Java代码
  1. public   boolean  onKeyDown( int  keyCode, KeyEvent msg){  
  2.           
  3.         switch (keyCode){  
  4.         case  KeyEvent.KEYCODE_DPAD_LEFT:  
  5.             updateLeft();  
  6.             break ;  
  7.               
  8.         case  KeyEvent.KEYCODE_DPAD_RIGHT:  
  9.             updateRight();  
  10.             break ;  
  11.         case  KeyEvent.KEYCODE_DPAD_UP:  
  12.             updateUp();  
  13.             break ;  
  14.         case  KeyEvent.KEYCODE_DPAD_DOWN:  
  15.             updateDown();  
  16.             break ;  
  17.         case  KeyEvent.KEYCODE_DPAD_CENTER:  
  18.             showResult();  
  19.             break ;  
  20.         }  
  21.           
  22.         return   false ;  
  23.     }  
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.  还需要判断移动是否合理

Java代码
  1. 以下几种情况不合理:  
  2.   
  3. 1 . 当图形左边 比 图形最大宽度 还大  
  4. 2 . 当图形上边 比 图形最大高度 还大  
  5. 3 . 图形宽度 或 高度 小于  0   
以下几种情况不合理:

1. 当图形左边 比 图形最大宽度 还大
2. 当图形上边 比 图形最大高度 还大
3. 图形宽度 或 高度 小于 0

 

Java代码
  1. public   boolean  isUpdateOK(){  
  2.         if ((startX > lengthX)||(startY > lengthY)||(lengthX >  0 )||(lengthY >  0 )){  
  3.             return   false ;  
  4.         }  
  5.         else  {  
  6.             return   true ;  
  7.         }  
  8.     }  
public boolean isUpdateOK(){
    	if((startX > lengthX)||(startY > lengthY)||(lengthX > 0)||(lengthY > 0)){
    		return false;
    	}
    	else {
    		return true;
    	}
    }

 

 

8. 具体移动方法:

Java代码
  1. public   void  updateLeft(){  
  2.         startX += step;  
  3.         lengthX = width-startX;  
  4.         lengthY = height-startY;  
  5.           
  6.         if (isUpdateOK()){  
  7.             target1.recycle();  
  8.               
  9.             target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
  10.               
  11.             iv2.setImageBitmap(target1);  
  12.               
  13.             setContentView(lLauout);  
  14.         }  
  15.     }  
  16.     public   void  updateUp(){  
  17.         startY += step;  
  18.         lengthX = width-startX;  
  19.         lengthY = height-startY;  
  20.           
  21.         if (isUpdateOK()){  
  22.             target1.recycle();  
  23.               
  24.             target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
  25.               
  26.             iv2.setImageBitmap(target1);  
  27.               
  28.             setContentView(lLauout);  
  29.         }  
  30.     }  
  31.     public   void  updateRight(){  
  32.         lengthX -= step;  
  33.           
  34.         if (isUpdateOK()){  
  35.             target1.recycle();  
  36.               
  37.             target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
  38.               
  39.             iv2.setImageBitmap(target1);  
  40.               
  41.             setContentView(lLauout);  
  42.         }  
  43.     }  
  44.     public   void  updateDown(){  
  45.         lengthY -= step;  
  46.           
  47.         if (isUpdateOK()){  
  48.             target1.recycle();  
  49.               
  50.             target1 = Bitmap.createBitmap(ori,startX, startY, lengthX, lengthY);  
  51.               
  52.             iv2.setImageBitmap(target1);  
  53.               
  54.             setContentView(lLauout);  
  55.         }  
  56.     }  
  57.       
  58.       
  59.     public   void  showResult(){  
  60.         AlertDialog.Builder ab = new  AlertDialog.Builder( this );  
  61.         AlertDialog aDialog;  
  62.           
  63.         ab.setMessage("startX:" +startX+ "/n" + "startY:" +startY+ "/n" + "lengthX:" +lengthX+ "/n" + "lengthY:" +lengthY).setTitle( "show result" ).show();;  
  64.         aDialog = ab.create();  
  65.   
  66.         aDialog.show();  
  67.           
  68.     }  
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 运行情况: 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值