Android View使用、自定义和性能优化(3)

本文详细介绍了Android应用开发中如何使用XML布局文件控制控件,包括加载布局、关联控件,以及使用Java代码动态创建和控制视图。此外,还着重讲解了自定义View的基础方法和实例,如onDraw()和自绘控件的实现。
摘要由CSDN通过智能技术生成

android:textSize=“@dimen/text_size_18” />

<Button

android:id=“@+id/btn_xml”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“center”

android:layout_marginTop=“@dimen/dimen_20”

android:background=“@color/color_188FFF”

android:padding=“@dimen/dimen_10”

android:text=“按钮”

android:textColor=“@color/white”

android:textSize=“@dimen/text_size_18” />

2.加载布局文件、关联控件

如果要使用上面的XML布局文件(activity_view.xml),通常需要在onCreate方法中使用setContentView方法指定XML布局文件的资源lD,并获取在activity_view.xml文件中定义的某个View,代码如下:

public class ViewActivity extends AppCompatActivity{

private Button btnXml;

private TextView tvXml;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//加载布局文件

setContentView(R.layout.activity_view);

//如果想获得在activity_view.xml文件中定义的某个View

//关联控件:R.id.tv_xml是tvXml的ID,确保这个ID在R.layout.activity_view中

tvXml = findViewById(R.id.tv_xml);

//关联控件:R.id.btn_xml是btnXml的ID,确保这个ID在R.layout.activity_view中

btnXml = findViewById(R.id.btn_xml);

}

}

3.在获得XML布局文件中的视图对象时需要注意下面几点:

  • 先使用setContentView方法装载XML布局文件,再使用findViewByld方法,否则findViewByld方法会由于未找到控件而产生空指针异常,导致应用崩溃。

  • 虽然所有的XML布局文件中的视图ID都在R.id类中生成了相应的变量,但使用findViewByld方法只能获得已经装载的XML布局文件中的视图对象。

  • 例,activity_view.xml中TextView的对应R.id.tv_xml;

  • 其他XML文件中有TextView的R.id.tv_shuaiciid,tv_shuaici不在activity_view.xml中如果使用 tvXml = findViewById(R.id.tv_shuaici);

  • 结果应用崩溃。原因:在activity_view.xml中找不到ID为tv_shuaici的视图对象。

4.用代码控制视图

虽然使用XML布局文件可以非常方便地对控件进行布局,但若想控制这些控件的行为,仍然需要编写Java代码。在上面介绍了使用findViewByld方法获得指定的视图对象,当获得视图对象后,就可以使用代码来控制这些视图对象了。例如,下面的代码获得了一个TextView对象,并修改了TextView的文本。

TextView tvXml = findViewById(R.id.tv_xml);

//直接使用字符串来修改TextView的文本

tvXml.setText(“帅次”);

//使用字符串资源(res/values/strings.xml)

//其中R.string.str_tv_shuaici是字符串资源ID,系统会使用这个ID对应的字符串设置TextView的文本。

tvXml.setText(R.string.str_tv_shuaici);

「选择其中一样即可」,如果同时设置,最后一次设置为最终结果。

使用代码的方式来创建View对象


在更高级的Android应用中,往往需要动态添加视图。要实现这个功能,最重要的是获得当前的视图容器对象,这个容器对象所对应的类需要继承ViewGroup类。 将其他的视图添加到当前的容器视图中需要如下几步:

  • 第1步,获得当前的容器视图对象;

  • 第2步,获得或创建待添加的视图对象;

  • 第3步,将相应的视图对象添加到容器视图中。

实例

1.获得当前的容器视图对象

//1、获取activity_view.xml中LinearLayout对象

//2、也可以给LinearLayout添加@+id/,然后通过findViewById关联控件也能获取LinearLayout对象

LinearLayout linearLayout =

(LinearLayout)getLayoutInflater().inflate(R.layout.activity_view,null);

//加载布局文件

setContentView(linearLayout);

2.获得或创建待添加的视图对象

EditText editText = new EditText(this);

editText.setHint(“请输入内容”);

3.将相应的视图对象添加到容器视图中

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//1、获取activity_view.xml中LinearLayout对象

//2、也可以给LinearLayout添加@+id/,然后通过findViewById关联控件也能获取LinearLayout对象

LinearLayout linearLayout =

(LinearLayout)getLayoutInflater().inflate(R.layout.activity_view,null);

//加载布局文件

setContentView(linearLayout);

EditText editText = new EditText(this);

editText.setHint(“请输入内容”);

linearLayout.addView(editText);

}

效果图如下:

总结

  • 实际上不管使用那种方式,他们创建Android用户界面行为的本质是完全一样的。大部分时候,设置UI组件的XML属性还有对应的方法。

  • 对于View类而言,它是所有UI组件的基类,因此它包含的XML属性和方法是所有组件都可以使用的。

自定义View

=======

为什么要自定义View


Android系统提供了一系列的原生控件,但这些原生控件并不能够满足我们的需求时,我们就需要自定义View了。

自定义View的基本方法


自定义View的最基本的三个方法分别是: onMeasure()、onLayout()、onDraw(); View在Activity中显示出来,要经历测量、布局和绘制三个步骤,分别对应三个动作:measure、layout和draw。

  • 测量:onMeasure()决定View的大小;

  • 布局:onLayout()决定View在ViewGroup中的位置;

  • 绘制:onDraw()决定绘制这个View。

需要用到的两个对象


  • Canvas(画布),可在画布上面绘制东西,绘制的内容取决于所调用的方法。如drawCircle方法,用来绘制圆形,需要我们传入圆心的x和y坐标,以及圆的半径。

  • Paint(画笔),用来告诉画布,如何绘制那些要被绘制的对象。

这两个方法暂时了解就行,如果拓展开,这不够写,后面可能会针对这两个对象单独拉一个章节出来。

自绘控件View实例


1、直接继承View类

自绘View控件时,最主要工作就是绘制出丰富的内容,这一过程是在重写的onDraw方法中实现的。由于是View,它没有子控件了,所以重写onLayout没有意义。onMeasure的方法可以根据自己的需要来决定是否需要重写,很多情况下,不重写该方法并不影响正常的绘制。

/**

* 创建人:scc

* 功能描述:自定义View

*/

public class CustomView extends View {

private Paint paint;

//从代码创建视图时使用的简单构造函数。

public CustomView(Context context) {

super(context);

}

//从XML使用视图时调用的构造函数。

public CustomView(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

}

//View的绘制工作

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//实例化画笔对象

paint = new Paint();

//给画笔设置颜色

paint.setColor(Color.RED);

//设置画笔属性

//paint.setStyle(Paint.Style.FILL);//画笔属性是实心圆

paint.setStyle(Paint.Style.STROKE);//画笔属性是空心圆

paint.setStrokeWidth(10);//设置画笔粗细

//cx:圆心的x坐标;cy:圆心的y坐标;参数三:圆的半径;参数四:定义好的画笔

canvas.drawCircle(getWidth() / 4, getHeight() / 4, 150, paint);

}

}

2、在布局 XML 文件中使用自定义View

<com.scc.demo.view.CustomView

android:id=“@+id/view_circle”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

3、实现效果:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-gW1g6gTJ-1713729779823)]

[外链图片转存中…(img-GJtRRUhn-1713729779824)]

[外链图片转存中…(img-PLzpbMDh-1713729779826)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值