自定义view

Android中的Surface和SurfaceView

自闭症网瘾萝莉.ら 提交于 2020-02-12 03:13:35
转自:http://technicalsearch.iteye.com/blog/1967616 一、什么是Surface 简单的说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上(后面有原因解释)。传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。 在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原始缓冲区的句柄”,这句话包括下面两个意思: 1、通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C++语言中,可以通过一个文件的句柄,就可以获得文件的内容一样。 2、 原始缓冲区(a raw buffer)是用于保存当前窗口的像素数据的。 引伸地,可以认为Android中的Surface就是一个用来画图形(graphics)或图像(image)的地方。 根据Java方面的常规知识,我们知道通常画图是在一个Canvas对象上面进行的,由此,可以推知一个Surface对象中应该包含有一个Canvas(画布)对象。因此

Android中的Surface和SurfaceView

只愿长相守 提交于 2020-02-12 03:07:36
一、什么是Surface 简单的说 Surface对应了一块屏幕缓冲区,每个window对应一个 Surface,任何View都要画在 Surface的 Canvas上(后面有原因解释)。传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。 在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原始缓冲区的句柄”,这句话包括下面两个意思: 1、通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C++语言中,可以通过一个文件的句柄,就可以获得文件的内容一样。 2、 原始缓冲区(a raw buffer)是用于保存当前窗口的像素数据的。 引伸地,可以认为Android中的Surface就是一个用来画图形(graphics)或图像(image)的地方。 根据Java方面的常规知识,我们知道通常画图是在一个Canvas对象上面进行的,由此,可以推知一个Surface对象中应该包含有一个Canvas(画布)对象。因此,在前面提及的两个意思的基础上,可以再加上一条: 3、Surface中有一个Canvas成员

Android中View和ViewGroup介绍

旧时模样 提交于 2020-02-12 02:33:46
1. 概念 Android 中的View与我们以前理解的“视图”不同。在 Android 中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作 系统 中的window。 ViewGroup是View的子类,所以它也具有View的特性,但它主要用来充当View的容器,将其中的View视作自己的孩子,对它的子View进行管理,当然它的孩子也可以是ViewGroup类型。 ViewGroup(树根)和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接受和处理消息的功能,android系统所产生的消息会在这些ViewGroup和 View之间传递。 2. Android的窗口系统 Android的窗口系统是Client/Server模式的,我在这里只讲窗口系统的客户端(图1)。 我们所提到的概念:View,ViewGroup,DecorView,ViewRoot都是存在于窗口系统的Client端。 Android中的Window是表示Top Level等顶级窗口的概念。DecorView是Window的Top-Level View,这个View可以称之为主View,DecorView会缺省的attach到Activity的主窗口中。 ViewRoot建立了主View(DecorView)与窗口系统Server端的通讯桥梁,

自定义View 和 ViewGroup

人盡茶涼 提交于 2020-02-12 02:22:13
一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸按键相关 (10) ~ (12) 方法与窗口 焦点相关 (1) 构造方法 该构造方法在创建View实例, 或者从XML布局中加载并构建界面的时候调用. (2)加载回调方法 protected void onFinishInflate() 回调方法, 从XML布局中加载该重写的View组件的时候, 就会回调这个方法; (3)测量方法 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 这个方法用来检测View组件以及该View组件包含的子组件的大小 (4)定位组件方法 protected void onLayout(boolean changed, int left, int top, int right,int bottom) 被重写的View组件分配在其中的子组件的 位置 和 大小 的时候, 回调这个方法; (5)大小改变方法 protected void onSizeChanged(int w, int h, int oldw, int oldh) 当组件大小被改变的时候回调该方法; (6

Android-RecyclerView多布局封装

倖福魔咒の 提交于 2020-02-11 17:16:26
对多布局的封装,开发时主要处理 数据绑定接口,视图布局返回接口,数据绑定:在holder类提供了个tag属性,初始化holder会将视图布局返回的viewtype作为标识,这样在bindData方法时switch(holder.gettag())来判断holder类型,继而拿到holder的itemview,继而findviewById,绑定数据。视图布局返回:主要是多布局的逻辑处理,什么情况下返回什么样的布局 adapter:封装adapter用于生成通用holder;同时向在onCreateViewHolder方法中有参数view和layout布局的id,这个id是后续在holder类添加的属性tag:用来标识不同的布局holder; public abstract class RecycleViewAdapterUtil extends RecyclerView.Adapter<ViewHolder>{ List list; Context context; public RecycleViewAdapterUtil(Context context, List list){ this.list = list; this.context = context; } @Override public int getItemViewType(int position) {

简单好用的Adapter---ArrayAdapter

醉酒当歌 提交于 2020-02-10 04:49:06
拖延症最可怕的地方就是:就算自己这边没有拖延,但对方也会拖延,进而导致自己这边也开始拖延起来!现在这个项目我这边已经是完工了,但是对方迟迟没有搞定,导致整个项目无法提交。 这就是拖延症的可怕:我们不仅是与自己的拖延症作战,而是与所有有关人士的拖延症作战,决定项目是否能够提交,在于那个最慢的人。 既然决定权已经不在我的手上,那么我也可以做做其他事情,像是现在这样写写博客。 这次就介绍一下ListView中比较简单但又非常方便的ArrayAdapter。 ArrayAdapter是BaseAdapter的派生类,在BaseAdapter的基础上,添加了一项重大的功能:可以直接使用泛型构造。 我们先来看一个简单的例子: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) this.findViewById(R.id.list); UserAdapter adapter = new UserAdapter(this, R.layout.list_item); adapter.add(new User(10,

Android Adapter 与 Listview

余生颓废 提交于 2020-02-10 01:58:15
一、Adapter,BaseAdapter BaseAdapter应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,Adapter有如下结构: Public Methods abstract int getCount () How many items are in the data set represented by this Adapter. abstract Object getItem (int position) Get the data item associated with the specified position in the data set. abstract long getItemId (int position) Get the row id associated with the specified position in the list. abstract int getItemViewType (int position) Get the type of View that will be created by getView(int, View, ViewGroup) for the specified

【小程序】实现复用及造轮子入门

你说的曾经没有我的故事 提交于 2020-02-10 00:49:16
 小程序实现可以通过 template 和 component 两种方式实现代码的复用,以减少不必要的工作量。template 被官方称为模块,在 xml 和 css 中定义代码片段,然后可以在其他页面使用,事实上,template 像是复制粘贴的另一种形式,只是把复制粘贴的操作使用 <template> 标签来代替,减少了页面的简洁程度,方便维护(有点像 android 中的 <include> )。比起template, component 实现的自定义组件,可以进行自己的逻辑处理,并像官方提供的组件一样去使用。 template 和 component 的不同 component 和普通的 page 一样有 xml、css、json 和 js 文件,template 只有 xml 和 css 文件 component 可以处理点击事件,tempalte 需要在使用者的 js 中定义 template 的动态数据均来自使用者的传递,component 不是 对于 template,在使用者的 css 文件中定义的样式会覆盖模块中定义的样式,而对于 component,app 的样式和使用者的样式均不会影响到组件内部(除非使用 externalClasses ) component 只能使用类选择器 ,template 没有限制 …… template 复用弹窗

自定义admin管理工具(stark组件)

安稳与你 提交于 2020-02-09 04:31:18
自定义admin管理工具(stark组件) 创建项目 了解了admin的功能后,我们可以开始仿照admin编写我们自己的管理工具stark组件 首先创建一个新的项目,并创建三个app stark就是我们要编写的组件,我们的主要逻辑就写在里面 在settings配置中分别注册这三个app INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'app02.apps.App02Config', 'stark.apps.StarkConfig' ] 在app01和app02的models文件中创建数据类 # app01 from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) def __str__(self): return self.title #

Android开发中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi

蹲街弑〆低调 提交于 2020-02-08 03:17:27
错误信息字符串:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.first/com.first.Game}: java.lang.NullPointerException 一般都会在 Activity onCreate() 方法里的 setContentView( XXX ) 发生此错误,网上查阅了很多原因,大概有四种重要可能的原因: 原因一: xxx 的错误,若为 R.layout.main 那么应该是 main.xml 文件中的标签 使用错误,最常见的而且编译器不会提示的错误就是 android:name 和 android:id 两者混淆,仔细检查 main.xml 的标签是否全部正确 原因二:在 setContentView(view) 方法之后使用了 requestWindowFeature () 方法,并且在此错误下面会提示 requestFeature 必须在 setContentView 之前使用,只需要把 requestWindowFeature ()方法放在 setContentView(view)方法之前就可以解决 原因三:在 onCreate() 方法之外,并且不属于任何一个方法体内直接给某控件 findById(R.id.xx) 所导致,需要在某方法内并且在