【问题标题】:android image view gradient backgroundandroid图像视图渐变背景
【发布时间】:2015-12-03 15:49:22
【问题描述】:

所以,我不想更新ImageView 以根据手机陀螺仪和光传感器的某些事件更改渐变。但是,此时我正在尝试使用点击事件。

我想在点击事件中设置一个以中心为中心的径向渐变。我首先尝试考虑到这一点来设置布局背景,一切都很好。然后我尝试在布局中将其更改为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);
}

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

【问题讨论】:

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

标签: java android android-studio shader gradient


【解决方案1】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2022-09-29
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多