完整做一个自定义控件
来源:互联网 发布:n97i软件下载 编辑:程序博客网 时间:2024/05/02 00:26
为什么到晚上脑子才清楚,多希望白天没有这些那些的事找我。
正题···········正题···········正题
想好自己需要做什么样子的控件
1、创建一个继承 View、ViewGroup、或者LinearLayout等等的 一个类MyView.java(这个就是 自定义的控件 我继承的ViewGroup)
2、向MyView里添加控件 或者 直接在该类中自己画 (重写onMeasure、onLayout、onDraw);
添加控件 可以用在代码里用addView(找到MyView这个控件,然后myView.addView(button1) ) ;;;;;;;;; 也可以 XML里添加。
3、在MyView.java 文件里 处理添加的控件。
以下是代码。 mMyText是我的自定义控件
CustomActivity.java
private void initTextview() { String[] customText = new String[]{"我要打电话了了了了","我要","我要打电","我要打电话了了了了是是是是是是是","我要打电话了了了了"}; ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); for (int i =0;i<customText.length;i++) { TextView tv = new TextView(this); tv.setText(customText[i]); tv.setTextColor(Color.RED); mMyText.addView(tv,lp); } }
package myView;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import android.widget.RelativeLayout;import com.example.administrator.demo1.R;import static android.R.attr.padding;import static android.R.attr.width;import static android.os.Build.VERSION_CODES.M;/** * Created by Administrator on 2017/9/19. */public class MyText extends ViewGroup { private int textSize; private int textSpace; public MyText(Context context) { super(context); } public MyText(Context context, AttributeSet attrs) { super(context, attrs); //自定义属性 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyText); textSize = ta.getDimensionPixelSize(R.styleable.MyText_TextSize, 10); textSpace = ta.getDimensionPixelSize(R.styleable.MyText_TextSpace, 5); ta.recycle(); } public MyText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取该自定义控件 的 宽高 和 模式 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int paddingLeft = getPaddingLeft(); int paddingTop = getPaddingTop(); int lineWidth =0; int lineHeight = 0; int height = 0; //在获取子控件宽高的时候 一定要先测量 measureChildren(widthMeasureSpec,heightMeasureSpec); //获取子控件数量 int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { //获取子控件及其宽高 View child = getChildAt(i); //用这个方法也可以,这个方式是具体测量某一个子控件 //measureChild(child, widthMeasureSpec, heightMeasureSpec); //获取子控件的宽高 int width = child.getMeasuredWidth(); height = child.getMeasuredHeight(); //当余下的宽度不足于显示下一个子控件 要进行换行 if (lineWidth + width > widthSize) { //超出一行最大宽度 换行 lineHeight = lineHeight + height+ textSpace; lineWidth = paddingLeft+width +textSpace; //给child设置tag 供onLayout 设置子控件位置使用 child.setTag(new Location(paddingLeft, lineHeight, lineWidth, lineHeight + height)); }else{ child.setTag(new Location(lineWidth+paddingLeft,lineHeight,lineWidth+paddingLeft+width,lineHeight+height)); lineWidth = lineWidth+paddingLeft +width+textSpace; } } //如果 是warp_content 注意 这里的参数。 一定要是最下面控件的 的底部的Y值 否则就会出现最下一行的控件不显示 //同理 width也是一样的。 只适用于 属性为warp_content 此处 width 我用的属性是 match_parent setMeasuredDimension(lineWidth,lineHeight+height+textSpace); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); Location mLocation = (Location) child.getTag(); child.layout(mLocation.left, mLocation.top, mLocation.right, mLocation.bottom); } } private class Location { public Location(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } public int right; public int left; public int top; public int bottom; }}
自定义属性 放在res/valus/attrs.xml里 没有这个文件就自己创建
<declare-styleable name="TagsLayout"> <attr name="tagVerticalSpace" format="dimension" /> <attr name="tagHorizontalSpace" format="dimension" /></declare-styleable>
在控件里使用
<myView.MyTextandroid:id="@+id/custom_mytext"android:layout_width="match_parent"android:layout_height="wrap_content"app:TextSize="15dp"app:TextSpace="10dp">
studio会自动添加
xmlns:app="http://schemas.android.com/apk/res-auto"eclipse需要自己在布局文件里自己写。否则将不能调用 自定义属性
明天找个更炫酷的自定义控件试手············· 下班喽~~~~~
阅读全文
0 0
- 完整做一个自定义控件
- 做一个QQ用户自定义控件
- Android自定义控件:做一个拼图游戏
- 自己动手做一个日期选择控件(自定义控件)
- 做一个OpenGL控件
- ASP.net——一个完整的支持最小化的自定义Panel控件
- 做一个完整的P2P视频点播系统
- 做一个完整的P2P视频点播系统
- 自定义控件 shadeView 做阴影的控件
- 教你做一个可以弹出确认对话框的自定义Web服务器控件ConfirmButton
- 自己做的一个类似MSN弹出消息的框框的自定义控件
- Android自定义侧拉菜单-做一个为自己定制的侧拉控件
- 自定义---DialogCellEditor 一个完整的实例 3
- 自定义一个TopBar(完整流程)
- 5.15---自定义控件做搜索框
- 一步步做Android自定义圆环百分比控件
- 自定义控件画圆并做旋转
- 一个自定义控件的Demo
- java--Spring切入点表达式--TLjh
- java学习笔记-static初始化以及生命周期
- mysql怎么写(笔记)
- MySQL存储引擎--MyISAM与InnoDB区别
- Ball Blasting Game UVA
- 完整做一个自定义控件
- AS3中的类与属性的修饰符
- 关于tensorflow的好博客
- 如果catch里面有return语句,finally里面的代码还会执行吗?
- Android RecyclerView详解以及滑动删除等
- MySQL创建全文索引
- python爬虫解决验证码的思路
- Python中的logging模块就这么用
- Bean的作用域详解