自定义view

View的绘制流程

瘦欲@ 提交于 2020-03-03 05:48:13
根部: Android framework 处理是从根节点开始,对布局进行measure和draw ,整个View树的绘制流程在ViewRoot.java类的performTraversals()函数展开 performTraversals: 1.是否需要重新计算视图大小measure,2.是否需要重新安置视图的位置layout,3.是否需要重新绘制draw (measure测量)大小 -->(layout安排)位置 --> (draw绘制)内容 绘制顺序 DecorView是根布局 然后按照树形图遍历,父view要measure自己之后再去遍历子view measure 过程传递的两个类 ViewGroup.LayoutParams(View自身的布局参数) 用来指定高度和宽度,getLayoutParams()会得到父view的layoutParams MeasureSpecs类(父视图对自视图的测量要求) 测量和尺寸要求,有三个模式 UNSPECIFIED,没有约束 EXACTLY 确定尺寸 AT_MOST 父控件所给的最大尺寸,通常自定义 绘制流程 measure流程 view的 measure方法 measure(int,int) 调用onMeasure(int,int),但是measure是final类,所以子类必须复写onMeasure。 onMeasure:

[翻译]在objective c创建自定义collection view样式

拟墨画扇 提交于 2020-03-02 19:06:58
创建自定义collection样式 苹果在ios6中新增了一个更加易于创建和管理复杂用户界面的类:collection view。在此之前ios6上面用于展示多项列表的是table view,虽然名称是表格但它展示信息的形式并不是表格形式,而是垂直列表,当然在实际设计展示垂直可滚动的文本型列表时非常有用,但是你会遇到许多垂直可滚动的列表所存在的局限性,比如不能水平滚动,每行只有一项单元格,没有复杂的样式,在ios6之前你想要做到这些事情,只能靠自定义扩展。 在ios6 平台介绍了一个新的类:collection view ,它拥有所有table view的功能,新增了许多展示信息的方式并且变得更加易用。 table view 的功能非常有限,而collection view 则可以进行更加灵活的设计。它可以按不同的形式展示表格内容:横向或垂直滚动,列表或表格或任何你想要的自定义样式,它还提供了非常灵活的样式定义去为每一个 collection view 设定不同的展现形式,苹果提供了一个简单的例子来说明这个样式功能将会满足许多人的需要,这个 flow layout 是基于每一行定义的布局,每一个单元都可以线性地展现在上一个单元后面,直到该行填充完之后,切换到下一行。这将会根据他的配置项来决定时垂直还是水平滚动,或者网格形式(每行有多个单元格)。 即使你的样式不那么简单

Android 烦人的坐标原点

余生颓废 提交于 2020-03-02 11:38:49
屏幕的左上角是 系统坐标原点 (0,0),包括标题栏,通知栏高度。 getTop:获取到的,是view自身的顶边到其父布局顶边的距离 getLeft:获取到的,是view自身的左边到其父布局左边的距离 getRight:获取到的,是view自身的右边到其父布局左边的距离 getBottom:获取到的,是view自身的底边到其父布局顶边的距离 getX():获取点击事件相对控件左边的x轴坐标,即点击事件距离控件左边的距离 getY():获取点击事件相对控件顶边的y轴坐标,即点击事件距离控件顶边的距离 getRawX():获取点击事件相对整个屏幕左边的x轴坐标,即点击事件距离整个屏幕左边的距离 getRawY():获取点击事件相对整个屏幕顶边的y轴坐标,即点击事件距离整个屏幕顶边的距离。 系统坐标原点。 c. getLocationInWindow():坐标原点在B c. getLocationOnScreen():坐标原点在A,系统坐标原点。 一、 new HelloView 时 View 的原点: /** * 初始化绘制线的画笔 * */ public void initLinePaint(){ linePaint = new Paint(); // 设置画笔 linePaint .setColor(Color. GREEN ); linePaint .setAntiAlias(

android上下滑动View的实现

有些话、适合烂在心里 提交于 2020-03-02 04:06:04
先放上这个自定义的View的代码, package com.example.viewpagervertical; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; import android.widget.Scroller; import android.widget.Toast; /** * 实现这个上下滑动的效果,主要利用了屏幕坐标系和滚动条 * @author Administrator * */ public class VerticalPager extends ViewGroup{ private Scroller mScroller; //滚动条 private Context mContext; private final static int RATE = 5; //速率标准 private

微信小程序自定义toast的实现

試著忘記壹切 提交于 2020-03-02 00:05:00
今天写微信小程序突然发现一个尴尬的问题,请求报错需要提示,就去小程序API里找,可悲的小程序的toast并不能满足我的需求,原生提供的方法调用如下 wx.showToast({ title: '成功', icon: 'succes', duration: 1000, mask:true }) 下面是官方API的说明 可以看到支持的图标只有两种,连基本的warning和error都没有,最可悲的是title最多只支持7个汉字的长度,完全不能忍啊,现在哪个框架里还没有个正儿八经提示框的组件,想想还是自己写一个算了,下面是效果图 下面来说下小程序实现自定义公共组件的方法,以自定义toast为例 1、新建toast组件 在toast.json里修改如下,设置为组件 { "component": true } toast.wxml <view class='wx-toast-box' animation="{{animationData}}"> <view class='wx-toast-content'> <view class='wx-toast-toast'>{{ content }}</view> </view> </view> 定义样式,toast.wxss,这里使用flex布局,代码很简单,也没什么好说的,直接贴上 .wx-toast-box{ display: flex;

listview加载性能优化ViewHolder

孤者浪人 提交于 2020-03-01 21:21:14
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。 ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的(要自定义listview都需要重写listadapter: 如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。 getview的加载方法一般有以下三种种方式: 最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据 public View getView(int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.layout.list_item_icon_text, null); ((TextView) item

Android TagFlowLayout布局实现

假如想象 提交于 2020-03-01 14:02:21
一、简 介 由于移动互联网的发展,大数据技术的进步,app厂商或者犯罪分子会推广你喜欢的内容或者广告。对于各种类型的需求,通过关系数据库心亦不能满足需要,这种情况通过nosql数据库来存储用户兴趣。对于用户兴趣的标注,就是通过tag或者cookie等实现。在这方面,客户端需求也是很大,无论是供应链、内容还是地理定位,都有很大的需求。 这种标记方式比较常用 二、代码实现 public class TagFlowLayout extends ViewGroup { private final static String TAG = "TagFlowLayout"; //自定义属性 private int spacingBetweenItems; private int lineSpacing; private OnItemSelectedListener mOnItemSelectedListener; private OnItemRemovedlistener mOnItemRemovedListener; public TagFlowLayout(Context context) { this(context, null); } public TagFlowLayout(Context context, AttributeSet attrs) { this(context,

Android有用代码片段(四)

走远了吗. 提交于 2020-03-01 02:46:42
不知不觉中,就收集了超过60条的自己感觉有意思的代码片段,分为三篇文章: android有用代码片段 、 Android有用代码片段(二) 、 Android有用代码片段(三) 这三篇,今天,开始第四篇的整理! 六十一、Android创建桌面快捷方式: [java] view plain copy print ? /** * 为程序创建桌面快捷方式 */ private void addShortcut(){ Intent shortcut = new Intent( "com.android.launcher.action.INSTALL_SHORTCUT" ); //快捷方式的名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); shortcut.putExtra( "duplicate" , false ); //不允许重复创建 //指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer //注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序 ComponentName comp = new ComponentName( this .getPackageName(), "

Android 自定义适配器

我的梦境 提交于 2020-03-01 02:34:38
项目开发中经常需要去自定义适配器,若自定义适配器写得好整个界面就会非常的流畅,反之程序就歇菜了。 下面先贴代码,再讲讲自定义适配器的过程中需要注意的细节。 首先是Activity的代码: package com.example.textviewtest; import android.app.Activity; import android.content.Context; import android.os.Bundle;import android.widget.ListView; public class MainActivity extends Activity{ private static final String TAG = "MainActivity"; private String[] data = {"三星","小米","魅族","苹果","华为","一加","荣耀","Mate7","努比亚","OPPO","vivo","大神","乐视","小辣椒","P8","奇酷","锤子","金立"}; private ListView mListView; private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate

Android GUI之Activity、Window、View

走远了吗. 提交于 2020-02-29 21:32:25
  相信大家在接触Android之初就已经知道了Activity中的setContentView方法的作用了,很明显此方法是用于为Activity填充相应的布局的。那么,Activity是如何将填充的布局绘制出来的呢?实际上Activity将View的绘制与显示交给了Window对象来处理,下面我们通过源码来进行跟踪分析。   Activity的源码如下,只给出我们关注的部分: public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback { …… …… private Window mWindow; private WindowManager mWindowManager; …… /** * Retrieve the current {@link android.view.Window} for the activity. * This can be used to directly access parts of the Window