Android中利用OnTouchListener在ImageView中框选显示图片

帮论坛上朋友改的一个程序,主要是在Imageview中框选部分图片,并显示出来,正好也用到了我上篇文章中说到的动态加载控件,就顺便贴出来

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. package com.test.t;  
  2. import android.app.Activity;  
  3. import android.content.res.Resources;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.drawable.BitmapDrawable;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11. import android.view.View.OnTouchListener;  
  12. import android.widget.ImageView;  
  13. import android.widget.LinearLayout;  
  14. public class T extends Activity {  
  15.     /** Called when the activity is first created. */  
  16.     Bitmap bmp;  
  17.     Bitmap bmpp;  
  18.     OnTouchListener listen1;  
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.        // setContentView(R.layout.main);  
  23.         final LinearLayout layout2=new LinearLayout(this);  
  24.         layout2.setOrientation(LinearLayout.VERTICAL);  
  25.         Resources res=getResources();  
  26.         bmp=BitmapFactory.decodeResource(res,R.drawable.capture);  
  27.         BitmapDrawable bmp1=new BitmapDrawable(bmp);  
  28.         ImageView image1=new ImageView(this);  
  29.         image1.setImageDrawable(bmp1);  
  30.         image1.setClickable(true);  
  31.         layout2.addView(image1);  
  32.         setContentView(layout2);  
  33.          
  34.         listen1=new OnTouchListener(){  
  35.             float startx=0.0f;  
  36.             float starty=0.0f;  
  37.             float endx=0.0f;  
  38.             float endy=0.0f;  
  39.             @Override  
  40.             public boolean onTouch(View v, MotionEvent event) {  
  41.                 // TODO Auto-generated method stub  
  42.                 float x=event.getX();  
  43.                 float y=event.getY();  
  44.                 if(event.getAction()==MotionEvent.ACTION_DOWN){  
  45.                 startx=x;  
  46.                 starty=y;  
  47.                   
  48.                 }  
  49.               if(event.getAction()==MotionEvent.ACTION_UP){  
  50.                 endx=x;  
  51.                 endy=y;  
  52.                 int sx=(int)startx;  
  53.                 int sy=(int)starty;  
  54.                 int ex=(int)endx;  
  55.                 int ey=(int)endy;  
  56.                 bmpp=Bitmap.createBitmap(bmp,sx,sy,Math.abs(ex-sx),Math.abs(ey-sy));  
  57.                  BitmapDrawable bmpp1=new BitmapDrawable(bmpp);  
  58.                  ImageView im1=new ImageView(v.getContext());  
  59.                     im1.setImageDrawable(bmpp1);  
  60.                  layout2.addView(im1);  
  61.                 }  
  62.                 return true;  
  63.             }  
  64.               
  65.               
  66.               
  67.               
  68.         };  
  69.           
  70.         image1.setOnTouchListener(listen1);  
  71.           
  72.           
  73.           
  74.     }     
  75. }  
 

简要步骤:

1.新建自己的layout,以便动态添加imageview等控件,并利用setOrientation设置为vertical

final LinearLayout layout2=new LinearLayout(this);

2.引用资源中的图片,并生成BitmapDrawable

 Resources res=getResources();
        bmp=BitmapFactory.decodeResource(res,R.drawable.capture);
        BitmapDrawable bmp1=new BitmapDrawable(bmp);

其中R.drawable.capture 引用res/drawable文件夹下的capture.bmp,这个图片是我直接拷到darwable文件下的,正常情况下R.java中的R.drawable下应该有capture了,这个会自动生成,如果没有自动生成的话,检查一下Eclipse->project->Automatically是否勾选上

3.生成Imageview, 并设置imageview支持click

 ImageView image1=new ImageView(this);
        image1.setImageDrawable(bmp1);
        image1.setClickable(true);

4.把image1添加到layout2中,并设置setContentView

layout2.addview(image1);

setContentView(layout2);

到这步,已经成功的添加了imageview,并显示出来,可以下载到手机上看看,这里就不截图了

 

5.接下来,主要是添加OnTouchListener();类似于OnClickListener(),不过需要在new OnTouchListener中实现OnTouch函数。OnTouchListenter是个接口,必须在类中实现它,所以new 了个类OnTouchListener,并在类中implement OnTouch函数。

其中,float startx=0.0f;
            float starty=0.0f;
            float endx=0.0f;
            float endy=0.0f;

是2个坐标点,一个起始点,一个结束点,根据这两个对角线的点,就可以框选出矩形图。

 

6.接下来说一下OnTouch中的代码主要通过event.getAction()判断下是ACTION_DOWN(初始点),还是ACTION_UP(结束点)

并记录下来,在ACTION_UP(结束点)触发后,就利用sx,sy,ex,ey来生成bmp

bmpp=new Bitmap.CreateBitmap(bmp,sx,sy,Math.abs(ex-sx),Math.abs(ey-sy));

7.剩下的就简单了,新建个imageview,并添加到layout2中

 

目前没有写框选时出现的矩形框代码,以后有时间添加上,虽然没有矩形框显示出来,但实际上已经框选好了,并在另一个动态添加的控件imageview中显示出来。呵呵,最后效果(手机忘带了,就用Emulator调了下)

 

android模拟器截图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值