Android固定imageview大小,点击图片上某点,获取该点的RGB颜色。

有几种坐标需要熟悉一下。我们在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;
    }
});
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值