有几种坐标需要熟悉一下。我们在imageview中可以固定宽度。我固定的是300dp*300dp。但是我们给imageview设置触摸监听时,可以获得点击屏幕的位置,该位置的坐标是和dp没什么关系的,需要我们在代码中获得,也就是imageView.getWidth(),imageView.getHeight()方法。根据如上两个方法获得的坐标我就暂时叫为屏幕坐标吧。
当我们在imageview中放置图片时,图片的分辨率如果大于300*300,那么imageview默认是没有任何拉伸就显示的。如果图片较为宽,那么宽度将铺满imageview,高度等比例缩小。图片较长时也是一样。
知道了这个我们再来看一下bitmap,关于其原理我了解的也不多,哈哈,我也是新手。不过通过打印日志可以看到,bitmap的长宽正好就是分辨率的大小,感兴趣的朋友可以试一下。而bitmap的getPixel方法,可以根据像素点的位置来获得该像素的颜色,那么我们是不是只要触摸到了屏幕,然后获取了触摸屏幕在imageview的相对坐标,将其转化为对应像素点在bitmap中的坐标就可以了呢?然后通过getPixel方法即可获取对应颜色,突然发现自己这么聪明。哈哈,说着玩的。
关于颜色值是用一个textview显示的。废话不多说,直接看代码吧。
xml代码:
<TextView
android:id="@+id/tv_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"/>
<ImageView
android:id="@+id/image_1"
android:layout_width="300dp"
android:layout_height="300dp"
android:src="@drawable/test2"
android:layout_marginTop="20dp"
android:layout_gravity="center_horizontal"/>
java代码:注意看注释。bitmap需要先初始化的,可以再oncreate方法中加入。
private ImageView imageView;
private Bitmap bitmap;
//注册setOnTouchListener方法,注意,bitmap需要先初始化为imageview的图片。
//具体代码为bitmap=((BitmapDrawable)(imageView.getDrawable())).getBitmap();
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//得到imgview的长宽
double imgwidth=imageView.getWidth();
double imgheight=imageView.getHeight();
//bitmap的长宽
double bitwidth=bitmap.getWidth();
double bitheight=bitmap.getHeight();
//触摸的位置在imgview的坐标位置
double x=motionEvent.getX();
double y=motionEvent.getY();
//转换为bitmap的坐标
double actx0,acty0;
double stretchx,stretchy; //在imgview中,图片实际显示大小,dp为单位
//获取actx0,acty0,为实际的图片原点在imageview的dp坐标
if(bitheight<300&&bitwidth<300){ //图片的长宽都小于imgview大小,单位是dp
actx0=(300-bitwidth)/2;
acty0=(300-bitheight)/2;
stretchx=bitwidth;stretchy=bitheight;
}else{//其他情况都需要压缩,分为宽度大,还是高度大两种情况
if(bitwidth>=bitheight){
actx0= (double) 0.0;
acty0= (double) ((300.0-(bitheight*300.0)/bitwidth)/2.0);
stretchx=300;stretchy=(bitheight*300.0)/bitwidth; //在
}else{
acty0=(double)0.0;
actx0= (double) ((300.0-(bitwidth*300.0)/bitheight)/2.0);
stretchx=(bitwidth*300.0)/bitheight;stretchy=300;
}
}
//更新为屏幕坐标
actx0=(actx0/300)*imgwidth;
acty0=(acty0/300)*imgheight;
stretchx=(stretchx/300)*imgwidth;
stretchy=(stretchy/300)*imgheight;
//判断触摸点是否在图片上
if(x<actx0||x>actx0+stretchx||y<acty0||y>acty0+stretchy)
return true;
//更新在bitmap坐标系中的坐标
actx0=(x-actx0)/stretchx*bitwidth;
acty0=(y-acty0)/stretchy*bitheight;
//获取图片颜色,在手抬起来时
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
int color = bitmap.getPixel((int)actx0, (int)acty0);
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
int a = Color.alpha(color);
textView.setText("color=" + color + "a=" + a + ",r=" + r + ",g=" + g + ",b=" + b + "x=" + actx0 + "y=" + acty0);
}
return true;
}
});