Java android图像视图渐变背景

Java android图像视图渐变背景,java,android,android-studio,shader,gradient,Java,Android,Android Studio,Shader,Gradient,因此,我不想更新ImageView来根据手机陀螺仪和光传感器的一些事件改变梯度。然而,在这一刻,我正在尝试它与点击事件 我想在单击事件中设置一个中心为中心的径向渐变。我第一次尝试设置布局背景时就考虑到了这一点,一切都很好。然后我尝试在布局中更改图像视图(在大小和位置上是所需的视觉元素),渐变中心向下和向右移动 代码如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(saved

因此,我不想更新
ImageView
来根据手机陀螺仪和光传感器的一些事件改变梯度。然而,在这一刻,我正在尝试它与点击事件

我想在单击事件中设置一个中心为中心的径向渐变。我第一次尝试设置布局背景时就考虑到了这一点,一切都很好。然后我尝试在布局中更改
图像视图
(在大小和位置上是所需的视觉元素),渐变中心向下和向右移动

代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_seeker);

    RelativeLayout layout = (RelativeLayout) findViewById(R.id.seeker_layout);

    layout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {

                int location[] = new int[2];
                //measuring location of Image View to try and find correlation to shift
                findViewById(R.id.gradient_indicator).getLocationOnScreen(location);
                int grad_height = findViewById(R.id.gradient_indicator).getMeasuredHeight();
                int grad_width = findViewById(R.id.gradient_indicator).getMeasuredWidth();
                final float pos_x = event.getX();
                final float pos_y = event.getY();
                Toast position = Toast.makeText(getApplicationContext(), "Event Position (" + String.valueOf(pos_x) + "x" + String.valueOf(pos_y) + ")\n Window Dimensions(" + grad_width + "x" + grad_height + ")\n Window Position(" + location[0] + "x" + location[1] + ")", Toast.LENGTH_LONG);
                position.show();

                ShapeDrawable.ShaderFactory shader_factory = new ShapeDrawable.ShaderFactory() {

                    @Override
                    public Shader resize(int width, int height) {
                        RadialGradient radialGradient = new RadialGradient(pos_x, pos_y, 350, 0xff0000ff, 0, Shader.TileMode.MIRROR);
                        return radialGradient;
                    }
                };

                //Set curve radius to equal values in dp as specified in loaded xml shape
                float dp_radius = 5;
                int curve = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp_radius, getResources().getDisplayMetrics());
                float[] r_radii = new float[8];
                Arrays.fill(r_radii,curve);

                //create shape programatically that matches xml one
                RoundRectShape rs = new RoundRectShape(r_radii, null, null);
                ShapeDrawable sd = new ShapeDrawable(rs);
                sd.setShaderFactory(shader_factory);

                ImageView gradient_indicator = (ImageView) findViewById(R.id.gradient_indicator);

                if (Build.VERSION.SDK_INT >= 15) {
                    setBackgroundV15Plus(gradient_indicator, sd);
                } else {
                    setBackgroundV15Minus(gradient_indicator, sd);
                }


            }
            return true;
        }
    });
}
@TargetApi(15)
private void setBackgroundV15Plus(View view, ShapeDrawable sd) {
    view.setBackground(sd);

}

@SuppressWarnings("deprecation")
private void setBackgroundV15Minus(View view, ShapeDrawable sd) {
    view.setBackgroundDrawable(sd);
}

这是我得到的结果的图像,我用红色圆圈标记了光标的位置

如Nanoc所建议的工作解决方案(虽然不是非常优雅,但它是有效的):
我的解决方法是在xml ImageView声明中添加边距。然后,您可以从Java访问边距,而无需转换dp像素单位。从事件位置中减去所有值。
访问页边距的代码:
ImageView gradient_indicator=(ImageView)findViewById(R.id.gradient_indicator);RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)gradient_indicator.getLayoutParams();int grad_margin_top=lp.topMargin;int grad_margin_left=lp.leftMargin

如果它在用作布局背景时起作用,我打赌如果你使imageview全屏显示,它应该起作用,也许你需要从imageview位置偏移x,y。在布局背景中使用时,您是否注意到中心被明显地移到了底部?问题的根源似乎是xml中设置的边距或填充。如果我在ImageView本身上设置了边距,或者在保存图像的相对视图上设置了填充,则它将持续存在。如果我把它放在全屏上就没问题了。我可以通过从实际的点击事件中减去边缘像素来解决这个问题。然而,我希望这个问题能得到更优雅的解决,也许是在调用着色器调整大小功能时。如果你不想让imageview全屏显示,这是唯一的方法,在IOS中,你有一个bult-in函数将touchevent偏移到给定的视图,在Android中,你必须手动完成。无论如何,你所有的问题都是因为没有读这篇文章引起的:)那篇文章并没有真正评论需要通过编程从事件中更新xml形状的渐变/背景的负面影响。事实上,我想保留纵横比,这就是为什么原始形状是用xml和“dp”单位定义的。我确实明白安卓系统正在使这类操作变得困难。