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;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |