1

基本上有以下两个障碍:

  1. 我想在单击光标的坐标处获取图像的背景颜色。代码第一次获取颜色和坐标。但是当我再次单击时,会发生错误。
  2. 我想以十六进制而不是 RGB 整数值获取图像的颜色,然后在找到颜色的特定区域中用我的颜色更改该特定颜色。

这是代码:

private ImageView mImageView;
private Button button;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.vp_view_img);

    if(getIntent().hasExtra("BitmapImage")) 
    {
        final Bitmap bitmap = (Bitmap) getIntent().getParcelableExtra("BitmapImage");

        mImageView = (ImageView) findViewById(R.id.canvas_image);
        mImageView.setImageBitmap(bitmap);
        mImageView.setOnTouchListener(new ImageView.OnTouchListener()
        {     
            @Override   
            public boolean onTouch(View v, MotionEvent event)
            {
                int x = (int)event.getX();
                int y = (int)event.getY();

               /*Toast.makeText(getBaseContext(), "Touch coordinates : "
                                     + String.valueOf(event.getX()) + "x"
                                     + String.valueOf(event.getY()),
                                     Toast.LENGTH_SHORT).show();*/
                ImageView imageView = (ImageView) v;
                Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
                int pixel = bitmap.getPixel(x,y);
                int redValue = Color.red(pixel);
                int blueValue = Color.blue(pixel);
                int greenValue = Color.green(pixel);

                Toast.makeText(getBaseContext(), "Color Code :"+
                    redValue+blueValue+greenValue,Toast.LENGTH_SHORT).show();
                return true;    
                }    
            });
    }
    else
    {
        Toast.makeText(getBaseContext(), 
                "No Image Found", 
                Toast.LENGTH_LONG).show();
    }
}
4

2 回答 2

3

让我们从第二个问题开始:为了将 a Color(表示为 an Integer)转换为相应的十六进制值,您应该知道,十六进制颜色表示实际上是:

#RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB

所以你可以取你想要的颜色的基色分量,把它们单独变成一个十六进制字符串,然后把它们放在一起:

/**
 * Converts the passed integer (color) into it's hexadecimal representation  
 * @param pixel the Color to convert
 * @return a String: the <code>pixel</code> parameter in #RRGGBB format 
 */
private String rgbToHex(int pixel)
{
    int redValue = Color.red(pixel);
    int blueValue = Color.blue(pixel);
    int greenValue = Color.green(pixel);
    return "#" + getBaseColorAsHex(redValue) + 
        getBaseColorAsHex(greenValue) + 
        getBaseColorAsHex(blueValue);
}

/**
 * Returns the hex representation of the <code>baseColor</code>
 * parameter, padding up to 2 characters if necessary.
 * @param baseColor the color whose hex representation is needed
 * @return the hex code for the passed parameter
 */
private String getBaseColorAsHex(int baseColor)
{
    final String hex = Integer.toHexString(baseColor);
    return (hex.length() == 1 ? '0' : "") + hex;
}

从第一个问题开始,您应该提供您的 logcat 输出:在不知道错误的情况下,我们无法帮助解决它。

此外,您应该考虑将您的问题一分为二,因为在这种形式下,它不符合 Stack Overflow 的准则!

编辑:关于提出的第一个问题:一个严重的问题可能是您正在分析的图像小于屏幕,并且它被拉伸,因此当您点击屏幕并检索xy坐标时,将它们镜像到图像上失败由于到它的大小:x 或 y 的值可能大于宽度,分别是位图的高度。

除非您使用try-catch块并记录异常,否则您将无法判断问题到底出在哪里。

于 2012-05-16T09:11:43.043 回答
-1

使用选择器怎么样?

在 res/drawable 文件夹中,制作如下代码的 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="@color/white"/> <!-- selected -->
    <item android:state_pressed="true" android:color="@color/white" />  <!-- pressed -->
    <item android:color="@color/black" />
</selector>
于 2012-05-16T08:09:04.803 回答