OnTouch将发光效果应用于图像中心

时间:2013-08-22 06:24:44

标签: android ontouchevent glow

我有一个图像,我需要使用OnTouchListener将发光效果应用到图像的中心

像这样。

enter image description here

我怎样才能达到这个效果?我已经研究了可以将发光效果应用于图像外部的示例。

我们可以通过使用白色图像并将其置于背景图像的顶部来实现此目的,但我们可以在不使用图像的情况下实现吗?

修改

我也发现了这篇文章但没有解决方案。

Android : Image button or button Highlighted with Effect when Pressed

2 个答案:

答案 0 :(得分:4)

setOnTouchListener获取图片的getDrawingCache(),创建所需内容的渐变位图,然后将图像叠加在另一个上面

试试这个

final ImageView imageView = (ImageView) findViewById(R.id.imageView1);
    imageView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if(drawIt){
                    drawIt = false;
                    //Build the cache
                    imageView.buildDrawingCache();
                    Bitmap original = imageView.getDrawingCache();
                    //Build the gradient
                    Bitmap gradient = getGradient();
                    //Overlay the images
                    Bitmap finalImage = overlay(original,gradient,event.getX(),event.getY());
                    imageView.setImageBitmap(finalImage);
                }
                break;

            case MotionEvent.ACTION_UP:
                drawIt = true;
                break;
            }
            return false;
        }
    });

private Bitmap getGradient() {
    RadialGradient gradient = new RadialGradient(200 , 200, 200, 0xFFFFFFFF,
            0x00000000, android.graphics.Shader.TileMode.CLAMP);
    Paint p = new Paint();
    p.setDither(true);
    p.setShader(gradient);

    Bitmap bitmap = Bitmap.createBitmap(400, 400, Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);
    c.drawCircle(200, 200, 200, p);

    return Bitmap.createScaledBitmap(bitmap, 50, 50, false);
}

private Bitmap overlay(Bitmap bmp1, Bitmap bmp2,float x, float y) {
    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bmp1, new Matrix(), null);
    // Use your x and y cordinates here
    canvas.drawBitmap(bmp2, 100,100, null);
    return bmOverlay;
}

这是我得到的

enter image description here

您可以在此处进行修改,我有uploaded项目

最好的运气

<强> 修改

要在中心绘制它,请在overlay方法

中使用此行
 canvas.drawBitmap(bmp2, bmp1.getWidth()/2 - bmp2.getWidth()/2,bmp1.getHeight()/2  - bmp2.getHeight()/2, null);

要向按钮添加位图,请使用此

Button btn = (Button) findViewById(R.id.button1);
Drawable d = new BitmapDrawable(getResources(),finalImage);
btn.setBackgroundDrawable(d);

但请注意,当您将此位图设置为按钮时,按钮会调整大小,因此最好不要使用wrap_content,而是在硬代码中指定高度和宽度,例如25dp100dp等。是你必须控制的逻辑

您也可以使用ImageButton并将其设为

btn.setImageBitmap(finalImage);

对于MotionEvent

switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        drawIt = true;
        break;

    case MotionEvent.ACTION_UP:
        if(drawIt){
            //Build the cache
            imageView.buildDrawingCache();
            Bitmap original = imageView.getDrawingCache();
            //Build the gradient
            Bitmap gradient = getGradient();
            //Overlay the images
            Bitmap finalImage = overlay(original,gradient,event.getX(),event.getY());
            imageView.setImageBitmap(finalImage);
            Button btn = (Button) findViewById(R.id.button1);
            Drawable d = new BitmapDrawable(getResources(),finalImage);
            btn.setBackgroundDrawable(d);
            }
        break;

    case MotionEvent.ACTION_CANCEL:
        drawIt = false;
        break;
}

编辑2

声明这些实例变量

private boolean drawIt = true;
Button btn1,btn2;
int x_limit, y_limit;
Bitmap bmpOrignal, bmpGradient, bmpOverlay;

并像这样编码onTouch

@Override
public boolean onTouch(View v, MotionEvent event) {
    if(drawIt){
        drawIt = false;
        v.buildDrawingCache();
        bmpOrignal = v.getDrawingCache();
        bmpGradient = getGradient();
        bmpOverlay = overlay(bmpOrignal,bmpGradient);
        x_limit = v.getLeft() + bmpOrignal.getWidth();
        y_limit = v.getTop() + bmpOrignal.getHeight();

    }
    if(event.getX() > x_limit || event.getY() > y_limit){
        ((Button)v).setBackgroundDrawable(new BitmapDrawable(getResources(),bmpOrignal));
    }else {
        ((Button)v).setBackgroundDrawable(new BitmapDrawable(getResources(),bmpOverlay));
    }

    if(event.getAction() == MotionEvent.ACTION_UP){
        drawIt = true ;
    }
    return false;
}

您可以从here

下载新的更新项目

答案 1 :(得分:3)

如何使用

绘制圆圈
Canvas canvas = new Canvas(bmp);
canvas.drawCircle(x, y, radius, paint);

然后在for循环中以略小的alpha和更大的半径反复绘制相同的圆圈?

Paint.setAlpha();

编辑:实际上这对内存来说听起来很糟糕但是之前没有尝试过。