Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何创建自定义光标以获取ImageView的颜色_Android_Imageview_Color Picker - Fatal编程技术网

Android 如何创建自定义光标以获取ImageView的颜色

Android 如何创建自定义光标以获取ImageView的颜色,android,imageview,color-picker,Android,Imageview,Color Picker,彩色抓取应用程序的图像示例 您好,我想创建一个Android应用程序来识别图像中的颜色。我想使用自定义光标或视觉触摸来让用户知道上次触摸的区域,或者只是让用户在触摸图像时知道拾取的颜色。换句话说,我想为图像创建一个类似放大镜的光标。我想不出一个合适的名字,所以为了让我的解释清楚,请检查所附的图片:。谢谢看看这个类,这是一个自定义的ImageView。在onTouch()中获取坐标,并从该坐标中获取像素颜色。请根据您的使用情况自由修改 <com.xbadal.views.MyIma

彩色抓取应用程序的图像示例


您好,我想创建一个Android应用程序来识别图像中的颜色。我想使用自定义光标或视觉触摸来让用户知道上次触摸的区域,或者只是让用户在触摸图像时知道拾取的颜色。换句话说,我想为图像创建一个类似放大镜的光标。我想不出一个合适的名字,所以为了让我的解释清楚,请检查所附的图片:。谢谢

看看这个类,这是一个自定义的ImageView。在onTouch()中获取坐标,并从该坐标中获取像素颜色。请根据您的使用情况自由修改

    <com.xbadal.views.MyImageView
            android:id="@+id/signature_canvas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter"
            android:visibility="gone"
            tools:visibility="visible" />



public class MyImageView extends android.support.v7.widget.AppCompatImageView {
private final String TAG = getClass().getName();
private final float TOLERANCE = 20;
private final int defaultWidth = 30;

private Bitmap mBitmap;
private Canvas mCanvas;
private Context context;

private Paint paint;
private Point point;

private float mLastTouchX;
private float mLastTouchY;
private int imageX;
private int imageY;

//Parameter Constructor
public MyImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
}

// override onSizeChanged
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    Log.d(TAG, "onSizeChanged: " + h + "-" + w);
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

//Overriding onTouch
@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    //Invert Matrix to get proper coordinate
    float[] eventXY = new float[]{x, y};
    Matrix invertMatrix = new Matrix();
    getImageMatrix().invert(invertMatrix);
    invertMatrix.mapPoints(eventXY);
    imageX = (int) eventXY[0];
    imageY = (int) eventXY[1];

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            mLastTouchX = x;
            mLastTouchY = y;
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            final float dx = x - mLastTouchX;
            final float dy = y - mLastTouchY;

            if (Math.abs(dx) >= TOLERANCE || Math.abs(dy) >= TOLERANCE) {
                mLastTouchX = x;
                mLastTouchY = y;
                invalidate();
            }
            break;
        case MotionEvent.ACTION_UP:
            mLastTouchX = x;
            mLastTouchY = y;
            invalidate();
            break;
    }
    return true;
}

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    drawShape(canvas, mLastTouchX, mLastTouchY, defaultWidth);
}

//this method will detemine which shape to be drawn on the basis of ShapeId
public void drawShape(Canvas canvas, float x, float y, int width) {
    paint = new Paint();
    point = new Point();
    point.set((int) x, (int) y);


    Bitmap bitmap = ((BitmapDrawable) this.getDrawable()).getBitmap();
    if (x >= 0 && x < bitmap.getWidth() && y >= 0 && y < bitmap.getHeight()) {
        if (imageX >= 0 && imageX < bitmap.getWidth() && imageY >= 0 && imageY < bitmap.getHeight()) {
            int pixel = (bitmap.getPixel(imageX, imageY));
            int redValue = Color.red(pixel);
            int blueValue = Color.blue(pixel);
            int greenValue = Color.green(pixel);
            int alpha = Color.alpha(pixel);

        }
    }
}

公共类MyImageView扩展了android.support.v7.widget.AppImageView{
私有最终字符串标记=getClass().getName();
专用最终浮动公差=20;
私有最终int defaultWidth=30;
私有位图mBitmap;
私人帆布mCanvas;
私人语境;
私人油漆;
专用点;
私有浮动mLastTouchX;
私密的浮躁和敏感;
私人int imageX;
私人图像;
//参数构造函数
公共MyImageView(上下文、属性集属性){
超级(上下文,attrs);
this.context=上下文;
}
//覆盖范围已更改
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
Log.d(标签“onSizeChanged:”+h+“-”+w);
mBitmap=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
mCanvas=新画布(mBitmap);
}
//覆盖onTouch
@凌驾
公共布尔onTouchEvent(运动事件){
float x=event.getX();
float y=event.getY();
//将矩阵求逆以获得适当的坐标
float[]eventXY=新的float[]{x,y};
矩阵逆矩阵=新矩阵();
getImageMatrix().invert(invertMatrix);
逆矩阵映射点(eventXY);
imageX=(int)eventXY[0];
imageY=(int)eventXY[1];
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
mLastTouchX=x;
mLastTouchY=y;
使无效();
打破
case MotionEvent.ACTION\u移动:
最终浮点数dx=x-mLastTouchX;
最终浮子dy=y—最大浮子厚度;
如果(数学abs(dx)>=公差| |数学abs(dy)>=公差){
mLastTouchX=x;
mLastTouchY=y;
使无效();
}
打破
case MotionEvent.ACTION\u UP:
mLastTouchX=x;
mLastTouchY=y;
使无效();
打破
}
返回true;
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
drawShape(画布、mLastTouchX、mLastTouchY、默认宽度);
}
//此方法将根据ShapeId确定要绘制的形状
公共虚空drawShape(画布、浮点数x、浮点数y、整数宽度){
油漆=新油漆();
点=新点();
点集((int)x,(int)y);
位图位图=((BitmapDrawable)this.getDrawable()).getBitmap();
如果(x>=0&&x=0&&y=0&&imageX=0&&imageY

}

谢谢您的回答,但是如果我想在文本视图上显示颜色值,是否可能?文本视图位于不同的活动中。。