加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – android图像视图渐变背景

发布时间:2020-12-15 02:11:47 所属栏目:Java 来源:网络整理
导读:因此,我不想根据手机陀螺仪和Lightsensor的某些事件更新 ImageView来改变渐变.但是,此刻我正在尝试点击事件. 我想在click事件中设置一个带有中心的径向渐变.我首先考虑设置布局背景,一切都很好.然后我尝试在布局中为ImageView(大小和位置中所需的视觉元素)更
因此,我不想根据手机陀螺仪和Lightsensor的某些事件更新 ImageView来改变渐变.但是,此刻我正在尝试点击事件.

我想在click事件中设置一个带有中心的径向渐变.我首先考虑设置布局背景,一切都很好.然后我尝试在布局中为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,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

解决方法

像Nanoc建议的工作解决方案(它不是超级优雅但它的工作原理):我解决的方法是在xml ImageView声明中添加边距.然后,您可以从Java访问边距,而无需转换dp像素单位.减去事件位置和’all.Code以获取边距: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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读