开发 高质量 android应用 pdf,《打造高质量Android应用》读书笔记
前言
最近看到一本书,是开发安卓的一些小技巧和基础知识,大家一起查漏补缺吧!只有一部分,其他的有点老了,还有一些不感兴趣,没继续看了,所以只有9个知识点哦
1. 使用weight和weightsum属性实现视图居中
......
android:gravity="center"
android:orientation="horizontal"
android:weightSum="1" > //
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5" //确保按钮占据50%空间
......
/>
2. 在include里使用android:layout_*属性,重写include布局属性,实现复用
footer布局:
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="center"
android:text="@string/footer_text" />
include footer:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="30dp"
layout="@layout/footer" />
......
/RelativeLayout>
3. ViewStub实现view的延迟加载
场景:让用户自己决定是否显示地图信息
地图view
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
......
/>
使用ViewStub
android:id="@+id/map_stub"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:inflatedId="@+id/map_view"
android:layout="@layout/map" />
在Activity中调用
private View mViewStub;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mViewStub = findViewById(R.id.map_stub);
}
public void onShowMap(View v) {
mViewStub.setVisibility(View.VISIBLE);
}
......
inflatedId是调用ViewStub的inflate()方法或setVisibility()方法是返回的ID,这个ID便是被填充的View的ID,避免了使用findViewById()方法
4.定制ViewGroup
绘制布局由两个遍历过程组成:测量过程和布局过程。测量过程由measure(int, int)方法完成,该方法从上到下遍历视图树。在递归遍历过程中,每个视图都会向下层传递尺寸和规格。当measure方法遍历结束,每个视图都保存了各自的尺寸信息。第二个过程由layout(int,int,int,int)方法完成,该方法也是由上而下遍历视图树,在遍历过程中,每个父视图通过测量过程的结果定位所有子视图的位置信息。
为了理解这个概念,下面分析ViewGroup的绘制过程,第一步是测量ViewGroup的宽度和高度,在onMeasure方法中完成这个步骤。在该方法中,ViewGroup通过遍历所有子视图计算它的大小。最后一步操作,在onLayout()方法中完成,利用上一步计算出的测量信息,布局所有子视图。
作者实现了如下布局:
1>在values下创建attrs.xml,自定义属性
//属性名前缀是layout_,因此该属性会被添加到LayoutParams的属性表中
2>布局
xmlns:anyname="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
android:layout_width="fill_parent"
android:layout_height="fill_parent"
anyname:horizontal_spacing="30dp"
anyname:vertical_spacing="20dp" >
android:layout_width="100dp"
android:layout_height="150dp"
anyname:layout_vertical_spacing="90dp"
android:background="#FF0000" />
android:layout_width="100dp"
android:layout_height="150dp"
android:background="#00FF00" />
android:layout_width="100dp"
android:layout_height="150dp"
android:background="#0000FF" />
3>自定义CascadeLayout
public class CascadeLayout extends ViewGroup {
private int mHorizontalSpacing;
private int mVerticalSpacing;
public CascadeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.CascadeLayout);
try {
mHorizontalSpacing = a.getDimensionPixelSize(
R.styleable.CascadeLayout_horizontal_spacing,
getResources().getDimensionPixelSize(
R.dimen.cascade_horizontal_spacing));
mVerticalSpacing = a.getDimensionPixelSize(
R.styleable.CascadeLayout_vertical_spacing, getResources()
.getDimensionPixelSize(R.dimen.cascade_vertical_spacing));
} finally {
a.recycle();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 使用宽和高计算布局的最终大小以及子视图的x和y轴位置
int width = getPaddingLeft();
int height = getPaddingTop();
int verticalSpacing;
final int count = getChildCount();
for (int i = 0; i < count; i++) {
verticalSpacing = mVerticalSpacing;
View child = getChildAt(i);
measureChild(child, widthMeasureSpec, heightMeasureSpec); //令每个子视图测量自身
LayoutParams lp = (LayoutParams) child.getLayoutParams();
width = getPaddingLeft() + mHorizontalSpacing * i;
// 在LayoutParams中保存每个子视图的x、y坐标
lp.x = width;
lp.y = height;
if (lp.verticalSpacing >= 0) {
verticalSpacing = lp.verticalSpacing;
}
width += child.getMeasuredWidth();
height += verticalSpacing;
}
width += getPaddingRight();
height += getChildAt(getChildCount() - 1).getMeasuredHeight()
+ getPaddingBottom();
setMeasuredDimension(resolveSize(width, widthMeasureSpec),
resolveSize(height, heightMeasureSpec)); // 用计算所得宽高设置整个布局的测量尺寸
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
LayoutParams lp = (LayoutParams) child.getLayoutParams();
child.layout(lp.x, lp.y, lp.x + child.getMeasuredWidth(), lp.y
+ child.getMeasuredHeight());
}
}
@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof LayoutParams;
}
@Override
protected LayoutParams generateDefaultLayoutParams() {
return new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
}
@Override
protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
return new LayoutParams(p.width, p.height);
}
public static class LayoutParams extends ViewGroup.LayoutParams {
int x;
int y;
public int verticalSpacing;
public LayoutParams(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.CascadeLayout_LayoutParams);
try {
verticalSpacing = a
.getDimensionPixelSize(
R.styleable.CascadeLayout_LayoutParams_layout_vertical_spacing,
-1);
} finally {
a.recycle();
}
}
public LayoutParams(int w, int h) {
super(w, h);
}
}
}
5. TextSwitcher和ImageSwitcher实现平滑过渡
TextSwitcher: 为文本标签添加动画效果
ImageSwitcher : 为图片切换添加动画效果
mTextSwitcher.setFactory(new ViewFactory() {
@Override
public View makeView() {
TextView t = new TextView(MainActivity.this);
t.setGravity(Gravity.CENTER);
return t;
}
});
mTextSwitcher.setInAnimation(this, android.R.anim.fade_in);
mTextSwitcher.setOutAnimation(this, android.R.anim.fade_out);
mTextSwitcher.setText("hello");
6. 避免在Edittext中验证日期
在应用程序中使用Android内置资源是一个借用设备样式的好方法,如
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/edit_text"
/>
7. 格式化TextView的文本,如链接、不同样式文本等
链接:
textView1.setText(Html.fromHtml("Manning home page]]>"));
textView1.setMovementMethod(LinkMovementMethod.getInstance());
不同样式
final Spannable text2 = new SpannableString(
getString(R.string.text2));
text2.setSpan(new BackgroundColorSpan(Color.RED), 1, 4, 0);
text2.setSpan(new ForegroundColorSpan(Color.BLUE), 5, 9, 0);
XX.setText(text2);
8. 横竖屏
设置android:configChanges="orientation"就不会重启Activity,而是调用onConfigurationChanged()方法
9. 移除窗口默认背景提高应用程序启动速度
@null
true
9.更改toast显示位置
Toast toast = Toast.makeText(this, "Upper Left!",
Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP | Gravity.LEFT, 0, 0);
toast.show();
开发 高质量 android应用 pdf,《打造高质量Android应用》读书笔记相关推荐
- android linearlayout属性大全,Android中LinearLayout布局的常用属性总结读书笔记
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 原CSDN博客已弃用,文章会逐渐迁移过来. 应朋友们反馈的Android基础薄弱的问题,决定出一套Android基础教程 ...
- 质量总监成长记(前三章)--读书笔记
序:让人人成为克劳士比 笔记记录: 五个零缺陷的秘密:从改变生产模式向改变心智模式转变:从忙着解决问题向系统地预防问题转变:从改变产品.设备等硬件向改变人.组织等软件转变:从非此即彼的分割思想向整体思 ...
- python开发技术详解pdf下载_python开发技术详解附源码-python开发技术详解电子书pdf下载高清去水印版-精品下载...
Python开发技术详解适合Python爱好者.大中专院校的学生.社会培训班的学生以及用Python语言进行系统管理.GUI开发.Web开发.数据库编程.网络编程的人员使用. 内容提要 Python是 ...
- Android原生PDF功能实现,Android开发面试书籍
/** 加载PDF文件 */ private void loadPdf() { Intent intent = getIntent(); if (intent != null) { assetsFil ...
- 《Effective Python 编写高质量Python代码的59个有效方法》读书笔记
具体的59条 第 1 章 用 Pythonic 方式来思考 1 第 1 条:确认自己所用的 Python 版本 1 第 2 条:遵循 PEP 8 风格指南 3 第 3 条:了解 bytes. str ...
- android c pdf,我把所有Android第三方库整理成了PDF,送大厂面经一份!
目录 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. PagerAdapter 介绍 ViwePager 缓存策略 ViewPager 布局处 ...
- android存储pdf文件怎么打开,android打开pdf文件
我们在工作中肯定有需要,加载pdf或者doc的地方,但是,android没有提供一个好的打开方法,我又想吐槽下,人家ios可以直接打开的.. 有2钟方法打开pdf.doc. 方法一: 利用Intent ...
- android 最新pdf下载,深入剖析Android系统 (杨长刚) 中文pdf扫描版[127MB]
<深入剖析Android系统>以Android Jelly Bean(4.1)的代码为蓝本,对Android的部分关键代码进行了注释分析,并辅以大量插图,讲述了Android大部分子系统中 ...
- 软件开发不是众人拾柴——《人月神话》读书笔记
这里的"人月"指人数×月数,即劳动力×时间:这里的"神话"指一种理想的想法,即认为工作量=劳动力×时间,当时间有限而不能改变时,我们可以通过增加劳动力(人数)来 ...
- 《Android源码设计模式解析与实战》读书笔记(十六)
第十六章.访问者模式 访问者模式是一种行为型模式,它是23种设计模式中最复杂的一个,虽然使用频率不高,但是并不代表可以忽略,在合适的地方,它会带来意想不到的灵活性.访问者模式,顾名思义使用了这个模式后 ...
最新文章
- npoi导出execl源码,vs2008实现,包括using库
- 在ARC环境中autoreleasepool(runloop)的研究
- 线上直播丨Hinton等6位图灵奖得主、百余位顶级学者邀你群聊AI
- System Center Virtual Machine Manager 2012 SP1系列文章
- 关于《关于一道C#上机题的一点想法》
- Ambari安装之部署3个节点的HA分布式集群
- linux内核网络协议栈--监控和调优:发送数据(三十)
- android 酷狗demo_Android仿酷狗旋转界面功能-自定义控件实现
- shanghai international trade center
- .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权
- ubuntu linux下面运行《暗黑破坏神2》和英雄无敌3-死亡阴影
- 使用cloudbase-init初始化windows虚拟机
- mysql数据库存储多语言_数据库---数据控制语言(DCL)
- Solidity safesub防止溢出
- (一)apache atlas源代码编译与打包
- springboot2.x 集成百度 uidgenerator
- mysql数据结构_MySQL索引深入理解底层数据结构
- VS2022社区版安装教程
- string 析构崩溃 assign
- 单个html网页挂载IIS(不放在已经发布的项目下)并通过内网穿透代理公网可访问