首页 文章 精选 留言 我的

精选列表

搜索[桌面应用开发],共10000篇文章
优秀的个人博客,低调大师

Android应用开发—RecyclerView绘制蒙层

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77718470 背景:如何在跨越两个或两个以上的item绘制一个view,该view需要跟随recyclerView的滑动而整体移动。 @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); final View child = parent.getChildAt(1); if (child != null) { final int left = child.getLeft(); final int right = child.getRight(); final int top = child.getTop(); final int bottom = child.getBottom(); int rightV = (right - left) / 6; int leftV = (right - rightV) - VAUtils.dip2px(mContext, 225); int topV = bottom - VAUtils.dip2px(mContext, 16); int bottomV = topV + VAUtils.dip2px(mContext, 82); ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(mImageView.getLayoutParams()); margin.setMargins(leftV, topV, rightV, bottomV); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin); mImageView.setLayoutParams(layoutParams); if (!imageClicked) { mImageView.setVisibility(View.VISIBLE); } //画笔 final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //圆心 x 坐标 final float x = parent.getWidth() / 2 + left; ////圆心 y 坐标 final float y = 100 + top; //半径 final float radius = 100; //渐变着色器 坐标随意设置的 final LinearGradient shader = new LinearGradient(x-50, 0, x+100, 200, Color.RED, Color.YELLOW, Shader.TileMode.REPEAT); paint.setShader(shader); //绘制圆 c.drawCircle(x, y, radius, paint); } } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); //画笔 final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //圆心 x 坐标 final float x = parent.getWidth() / 2; ////圆心 y 坐标 final float y = 100; //半径 final float radius = 100; //渐变着色器 坐标随意设置的 final LinearGradient shader = new LinearGradient(x-50, 0, x+100, 200, Color.RED, Color.YELLOW, Shader.TileMode.REPEAT); paint.setShader(shader); //绘制圆 c.drawCircle(x, y, radius, paint); }

优秀的个人博客,低调大师

Android应用开发—TextView的动态创建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77131800 动态创建TextView的两种方式: 下面介绍两种创建方式: 在drawable里面创建共同依赖的background.xml文件,里面设置shape来设置文本框的一些特殊效果: eg: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 实心 --> <solid android:color="@android:color/white" /> <!-- 边框 --> <stroke android:width="0.5dp" android:color="@android:color/black" /> <!-- 圆角 --> <corners android:radius="3dp" /> <!-- 边距 --> <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> <!-- 渐变 --> <gradient android:angle="270" android:endColor="#FFFF782" android:startColor="#13C7AF" /> </shape> 代码方式: TextView textView = new TextView(context); textView.setId(id); textView.setText("android"); textView.setTextColor(0xff999faa); textView.setTextSize(12); textView.setBackgroundResource(R.drawable.background); xml配置文件和代码结合方式: textview_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#999faa" android:textSize="12sp" android:background="@drawable/background" android:text="android" /> </LinearLayout> ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.textiew, null); TextView textView = (TextView) findViewById(R.id.textView); viewGroup.removeView(textView); //替换掉textId textView.setId(id); 这样通过前面的两种方式即可创建一个TextView控件,通过xxxViewGroup.addView(textView)即可将改textView加入到xxxViewGroup中。 TextView控件布局位置的控制: 上面创建了textView控件,但该控件的布局位置并没有确定,而这个布局位置又是十分重要的,否则该控件也没有存在的意义。 //此处以RelativeLayout布局为例,同样LinearLayout也支持该接口 //设置RelativeLayout布局的宽高 RelativeLayout.LayoutParams reLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); //以下rules说明设置控件在xxxView的右侧,父控件的底部 reLayoutParams.addRule(RelativeLayout.RIGHT_OF, xxxViewId); reLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); //setMargins设置控件相对其他控件的间隔 reLayoutParams.setMargins(left, top, right, bottom); 以上代码只完成了RelativeLayout的布局rules的设置,如何和待控制的控件绑定呢? xxxViewGroup.addView(textView,reLayoutParams); 为TextView添加边框 在文章开始部分创建了一个background.xml文件,但并没有说明该xml文件的作用,不过也容易猜到,这个background.xml为textView设置了一个边框。 默认情况下TextView控件是没有边框的,如何创建边框,有以下方式: 设置background为透明图片的背景图。 通过shape设置背景图片。(推荐,background.xml即为这个shape配置文件,对该文件各项参数的设置,请参考google) 对前面代码中几处关键点的说明: View.setId(int id)如何避免id冲突: 按照规则,每个View都必须有一个唯一的标识符,这个标识符是一个正整数。而我们上面代码中动态创建的View要如何保证id的唯一性? 在sdk17 以上使用myView.setId(View.generateViewId());在低于17 的版本中我们需要自己去实现一些方法,参考View.Java的内部实现: private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); /** * Generate a value suitable for use in {@link #setId(int)}. * This value will not collide with ID values generated at build time by aapt for R.id. * * @return a generated ID value */ public static int generateViewId() { for (;;) { final int result = sNextGeneratedId.get(); // aapt-generated IDs have the high byte nonzero; clamp to the range under that. int newValue = result + 1; if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. if (sNextGeneratedId.compareAndSet(result, newValue)) { return result; } } } ID大于0x00FFFFFF的已经在xml中定义到了,容易发生冲突。 在调用的地方可以这样使用: if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { myView.setId(Utils.generateViewId()); } else { myView.setId(View.generateViewId()); } } 为什么要调用viewGroup.removeView(textView)? 一个View只能依赖于一个父ViewGroup,我们通过inflate这种方式创建的view已经属于一个ViewGroup了,所以此处需要父ViewGroup先remove掉,否则会报这样的错误:”The specified child already has a parent. You must call removeView” 关于异常“The specified child already has a parent. You must call removeView”的解决 扩展内容—动态添加布局 前面讲到动态添加控件,而布局同样可以动态添加: 方法和上面类似,主要注重如何控制添加的布局的位置,在控制布局的位置的时候使用LayoutParam类来实现。 RelativeLayout rl = new RelativeLayout(this); //设置RelativeLayout布局的宽高 RelativeLayout.LayoutParams relLayoutParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); xxxViewGroup.addView(rl, relLayoutParams); 控件属性相关的一些动态设置的接口: // 设置背景图 textView.setBackgroundResource(R.drawable.block_text_backgroumg); // 设置背景透明度 textView.getBackground().setAlpha(150); // 设定text内容为Html格式 textView.setText(Html.fromHtml(rsultText)); // 设定为可以scroll的textView textView.setMovementMethod(ScrollingMovementMethod.getInstance()); // 设定text内容与边框的距离 textView.setPadding(6, 6, 6, 6); 参考资料: Android 利用addView 动态给Activity添加View组件 android 中使用View.setId(int id),如何避免id冲突呢?

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册