3.Android Skill 图像、背景、View更新、布局、内存




图像


选择适当的图像尺寸

视图背景图像总会填充整个视图区域

 1.视图背景图像总会填充整个视图区域

          2.避免实时缩放

          3.最好预先缩放到视图大小


package com.zyy.android_csdn.skill;

import android.graphics.Bitmap;
import android.view.View;

/**
 * 
 * 精致的图片
 * 
 * @author CaMnter
 * 
 */
public class ExquisiteImage {

	// 被缩放的图片
	private Bitmap originalImage;

	// 视图
	private View view;

	public ExquisiteImage(Bitmap originalImage, View view) {

		this.originalImage = originalImage;

		this.view = view;

	}

	/**
	 * @return 适应View的Bitmap
	 */
	public Bitmap getBitmap() {

		/**
		 * 
		 * 第一参数:被缩放图像
		 * 第二参数:视图宽度
		 * 第三参数:视图高度
		 * 第四参数:双线性过滤器
		 * 
		 */
		return Bitmap.createScaledBitmap(this.originalImage,
				this.view.getWidth(), this.view.getHeight(), true);

	}

}



背景



        默认情况下, 窗口有一个不透明的背景

        

        有时可以不需要

      1.最高层的视图是不透明的

         2.最高层的视图覆盖整个窗口

            <1>.layout_width = fill_parent

            <2>.layout_height = fill_parent

         更新看不见的背景是浪费时间


	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		// 删除窗口背景
		getWindow().setBackgroundDrawable(null);
		
		...

	}





View更新


         当屏幕需要更新时, 调用 invalidate()

                 1.简单方便

          2.但是会更新整个视图, 代价太大了



         最好先找到无效的区域,然后调用

1.invalidate(Rect dirty);

          2.invalidate(int left, int top, int right, int bottom);





优化上:就是 原来的 刷新了整个视图,现在的只是刷新了 改变后的位置和原来的位置 在内的


一块区域







布局

越简单越好



如果一个窗口包含很多视图:

        1.启动时间长

     2.测量时间长

     3.布局时间长

     4.绘制时间长


        如果视图树深度太深 

        1.StackOverflowException

     2.用户界面反应速度很慢



解决办法:


1.使用TextView的复合drawables减少层次


2.使用ViewStub延迟展开视图


3.使用<merge>合并中间视图


4.使用RelativeLayout减少层次


5.使用自定义视图


6.使用自定义布局







内存


不要随意创建 Java 对象


在以下性能敏感的代码中,尽量避免创建Java对象:


1.测量:onMeasure()

                2.布局:onLayout()

3.绘图:dispatchDraw(), onDraw()

4.事件处理:dispatchTouchEvent(), onTouchEvent()

5.Adapter:getView(), bindView()



GC,垃圾回收


1.整个程序会暂停

2.慢(大概好几百个毫秒)




管理好Java对象


1.使用软引用:内存缓存的最佳选择


2.使用弱引用:避免内存泄露



	private final HashMap<String, SoftReference<T>> mCache;

	public void put(String key, T value) {
		mCache.put(key, new SoftReference<T>(value));
	}

	public T get(String key, ValueBuilder builder) {
		T value = null;
		SoftReferece<T> reference = mCache.get(key);
		if (reference != null) {
			value = reference.get();
		}
		if (value == null) {
			value = builder.build(key);
			mCache.put(key, new SoftReference<T>(value));
		}
		return value;
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值