学习View第三步
2016-05-05 23:33
190 查看
相信大家对View的测量和绘制有了粗浅的认识,但是得需要一个简单的入门小例子来进行巩固,我就直接从《Android群英传》里面的一个小例子说起。
MainActivity.java:
![](http://img.blog.csdn.net/20160505231107878?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
讲解:
首先drawRect是画一个矩形,现在Android知道是画一个矩形,但是这个矩形画哪儿呢?你可以覆写onMeasure()方法,但是我们这里直接使用了TextView自带的。绘制的基点是左上角,即以这个为标准来判断距离。你可以将这个四个参数变换就知道代表的什么。然后是save和restore()这两个方法在 现在还用不着,在用比较复杂的绘图界面时才会采用。这里是详解这两个方法的传送门:http://blog.csdn.net/oney139/article/details/8143281。
讲解:
假如,我们改变布局文件:
结果会是这样
![](http://img.blog.csdn.net/20160505232859203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
。
首先大家要明白canvas是画板!,然后canvas实际操作的是画布,即bitmap!这个在前面有说过,但是为什么会这样呢,其实如果大家将canvas.translate(50,0);给注释掉再运行就明白了。因为在TextView在绘图之前以及测量了大小。相当于我们固定了画板,但是画布整体左边移动了50,这时候我们在画板上就只能看到这些了。
这是在原有的控件进行了拓展,只是在绘制上进行了自定义,而不是完全自定义。
MainActivity.java:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } class My_TextView extends TextView{ private Paint mPaint1; private Paint mPaint2; public My_TextView(Context context) { super(context); initView(); } public My_TextView(Context context, AttributeSet attrs) { super(context,attrs); initView(); } public My_TextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { //也可以是使用getPaint()方法获得Paint的实例,但是只能是给一个引用,如果给两个则会混乱 mPaint1 = new Paint(); mPaint1.setColor(getResources().getColor(android.R.color.holo_blue_light)); mPaint1.setStyle(Paint.Style.FILL); mPaint2 = new Paint(); mPaint2.setColor(Color.YELLOW); mPaint1.setStyle(Paint.Style.FILL); } @Override protected void onDraw(Canvas canvas) { //绘制外层矩形 canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint1); //绘制内层矩形 canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2); //canvas.save(); canvas.translate(50,0); super.onDraw(canvas); //canvas.restore(); } }activity_main.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"> <com.example.li.view_my_three.My_TextView android:layout_width="200dp" android:layout_height="50dp" android:gravity="center" android:text="android" android:textSize="30sp" /> </LinearLayout>然后是效果图:
讲解:
canvas.drawRect
首先drawRect是画一个矩形,现在Android知道是画一个矩形,但是这个矩形画哪儿呢?你可以覆写onMeasure()方法,但是我们这里直接使用了TextView自带的。绘制的基点是左上角,即以这个为标准来判断距离。你可以将这个四个参数变换就知道代表的什么。然后是save和restore()这两个方法在 现在还用不着,在用比较复杂的绘图界面时才会采用。这里是详解这两个方法的传送门:http://blog.csdn.net/oney139/article/details/8143281。
讲解:
canvas.translate(50,0);这个方法是将画布向X轴方向平移了50,向Y轴平移了0。
假如,我们改变布局文件:
android:layout_width="wrap_content" android:layout_height="wrap_content"
结果会是这样
。
首先大家要明白canvas是画板!,然后canvas实际操作的是画布,即bitmap!这个在前面有说过,但是为什么会这样呢,其实如果大家将canvas.translate(50,0);给注释掉再运行就明白了。因为在TextView在绘图之前以及测量了大小。相当于我们固定了画板,但是画布整体左边移动了50,这时候我们在画板上就只能看到这些了。
这是在原有的控件进行了拓展,只是在绘制上进行了自定义,而不是完全自定义。
相关文章推荐
- java.sql.SQLException: QueryRunner requires a DataSource to be invoked in this way, or a Connection
- 搭建服务器上的GIT并实现自动同步到站点目录(www)
- mysql 常用基本命令
- exclude kernel or other packages from getting updated
- ssh原理[转]
- poj 1321 棋盘问题 - DFS 2251 Dungeon Master - BFS
- Java序列化技术
- 59. Divide Two Integers
- 避免头文件重复包含
- linux命令(20):rm命令
- 软件框架
- 基于icamera usb2.0的视频采集系统之mt9m001c12stc测评
- css overfloat:auto清除float 自动撑开
- ViewPager+Fragment使用中的Fragment生命周期
- 汇编语言org 07c00h的作用
- VIM 使用心得
- .net WebApi中使用swagger
- 重拾linux
- JavaWeb学习笔记——javabean与表单
- JAVA I/O(1)