• 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>


    怎样选取图片位置

    函数原型: Bitmap.createBitmap(Bitmap source, int x, int y, int width, int 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;  
        }  

     

    还须要推断移动是否合理

    下面几种情况不合理:    
    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+"
    "+"startY:"+startY+"
    "+"lengthX:"+lengthX+"
    "+"lengthY:"+lengthY).setTitle("show result").show();;  
            aDialog = ab.create();  
      
            aDialog.show();  
              
        }  


    emulator 执行情况: 

     

  • 相关阅读:
    js中两种定时器,setTimeout和setInterval的区别
    简单说 JavaScript实现雪花飘落效果
    CSS 浮动 float 属性
    使用jQuery做简单的图片轮播效果
    DIV+CSS中标签dl dt dd常用的用法
    CSS display的几个常用的属性值,inline , block, inline-block
    Confluence代码块(Code Block)宏
    salt总结
    快速搭建rabbitmq单节点并配置使用
    使用python脚本配置zabbix发送报警邮件
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5174811.html
Copyright © 2020-2023  润新知