自定义view

DRF权限组件

无人久伴 提交于 2019-11-30 07:46:07
1.DRF权限组件(局部+全局)    和上述的认证组件使用方式一样,定义一个权限类,必须要有 def has_permission(self,request, view):pass方法,可以在类中定义变量message指定无权限时的提示内容。   权限组件也可以在视图中局部使用,或者在settings.py中进行全局配置   在有注册登录操作时,为了避免认证和权限,还是继承View最好或使用局部认证配置。      settings.py    INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'rest_framework', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common

自定义View入门-绘制基础(1)

橙三吉。 提交于 2019-11-30 05:47:36
前言 说道自定义View,我们一定会想到,自定义View的绘制流程 测量阶段(measure) 布局阶段(layout) 绘制阶段(draw) 我们看到的一些炫酷的view效果,都是在绘制方法里去实现的, 也就是 draw(Canvas) , 我们先放下 测量与布局, 先从绘制基础开始学起。 详解 说到 ondraw(Canvas) 方法,不得不提 Paint 与 Canvas 。我们先来看 Paint 1.Paint Paint就是"画笔",我们先去看下Paint类的源码解释: ** * The Paint class holds the style and color information about how to draw * geometries, text and bitmaps. */ Paint类可以画几何图形,文本与bitmap。 Paint类方法比较多, 这里拿Paint.Style举例: Paint.Style.FILL:填充内部 Paint.Style.FILL_AND_STROKE :填充内部和描边 Paint.Style.STROKE :描边 2.Canvas (1).定义 Canvas就是“画布”,我们先去看下Canvas类的源码解释: * The Canvas class holds the "draw" calls. To draw

漫谈透明状态栏和沉浸式状态栏

会有一股神秘感。 提交于 2019-11-30 02:43:16
今天来写一个类似于qq空间的那种沉浸式效果。先来看看qq空间的这种效果 我们看到,头部局上拉的时候有个头布局的透明是从0变化到1,当你下拉的时候,头部局透明度又从1变化到0了。始终效果看起来还是不错的,当然这种效果要配合透明状态栏才好看。而且我们可以再很多应用各种会看到这种广告遮住头布局的方式。比如160的软件。 看起来效果还是挺酷炫的。现在我们就来讲讲他的实现方式吧。首先来看下demo实现的效果图 居然说到了透明状态栏,也说一下关于透明状态栏和沉浸式状态栏吧。我们首先说一下他的概念。 1.沉浸式全屏模式 隐藏status bar(状态栏)使屏幕全屏,让Activity接收所有的(整个屏幕的)触摸事件。相当于就是隐藏状态栏,让手机浏览进入全屏模式 2.透明化系统状态栏 透明化系统状态栏,使得布局侵入系统栏的后面,必须启用fitsSystemWindows属性来调整布局才不至于被系统栏覆盖。 透明状态栏的意思是指布局从状态栏开始。然后状态栏的一些东西比如电量那些基本信息会覆盖在布局上面。但透明状态栏是android 4.4及以上版本才有这种效果,4.4以下是不支持透明状态栏的。我们先看下不设置透明状态栏的效果。 布局文件是这样的 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

Day54 Django功能内部源码和模版层

北战南征 提交于 2019-11-30 02:18:55
一.Django中内部源码 1.render内部原理 render返回一个html页面,并且还能够给该页面传数据 render内部原理 from django.template import Template,Context def index(request): temp = Template('<h1>{{ user }}</h1>') con = Context({"user":{"name":'sxc',"password":'123'}}) res = temp.render(con) print(res) return HttpResponse(res) 2.FBV与CBV 视图函数层不只是只有函数,也可以是类 FBV(基于函数的视图):面向函数式编程 CBV(基于类的视图):面向对象式编程 现在写一个CBV的小例子 视图函数层生成一个类 views层 from django.views import View class Login(View): def get(self,request): return render(request,'login.html') def post(self,request): return HttpResponse('收到了') urls中编写对应的视图函数对应关系 urls层 url(r'^login/', views.Login

安卓自定义View进阶-手势检测(GestureDetector)

泪湿孤枕 提交于 2019-11-29 23:45:19
Android 手势检测,主要是 GestureDetector 相关内容的用法和注意事项,本文依旧属于事件处理这一体系,部分内容会涉及到之前文章提及过的知识点,如果你没看过之前的文章,可以到 自定义 View 系列 来查看这些内容。 在开发 Android 手机应用过程中,可能需要对一些手势作出响应,如:单击、双击、长按、滑动、缩放等。这些都是很常用的手势。就拿最简单的双击来说吧,假如我们需要判断一个控件是否被双击(即在较短的时间内快速的点击两次),似乎是一个很容易的任务,但仔细考虑起来,要处理的细节问题也有不少,例如: 记录点击次数 ,为了判断是否被点击超过 1 次,所以必须记录点击次数。 记录点击时间 ,由于双击事件是较快速的点击两次,像点击一次后,过来几分钟再点击一次肯定不能算是双击事件,所以在记录点击次数的同时也要记录上一次的点击时间,我们可以设置本次点击距离上一次时间超过一定时间(例如:超过100ms)就不识别为双击事件。 点击状态重置 ,在响应双击事件,或者判断不是双击事件的时候要重置计数器和上一次点击时间。重置既可以在点击的时候判断并进行重新设置,也可以使用定时器等超过一定时间后重置状态。 这样看起来,判断一个双击事件就有这么多麻烦事情,更别其他的手势了,虽然这些看起来都很简单,但设计起来需要考虑的细节情况实在是太多了。 那么有没有一种更好的方法来方便的检测手势呢

安卓自定义View进阶-Matrix原理

我与影子孤独终老i 提交于 2019-11-29 23:27:57
本文内容偏向理论,和 画布操作 有重叠的部分,本文会让你更加深入的了解其中的原理。 本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧。 由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。 ⚠️ 警告:测试本文章示例之前请关闭硬件加速。 Matrix简介 Matrix是一个矩阵,主要功能是坐标映射,数值转换。 它看起来大概是下面这样: Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子: 我的的手机屏幕作为物理设备,其物理坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。 以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的物理坐标系来绘制,Matrix在此处的作用就是转换这些数值。 假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。 以上是仅作为一个简单的示例,实际上不论2D还是3D

RecyclerView实现网格布局,仿应用列表

落花浮王杯 提交于 2019-11-29 21:26:15
简介 使用RecyclerView实现网格布局,实现手机界面应用列表 效果 效果如下图: 详细代码 XML布局文件 在布局中使用RecyclerView控件 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" android:background="#9709F7"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout

从0到1优雅实现沉浸式状态栏

好久不见. 提交于 2019-11-29 20:55:59
目录 1. 概述 2. 实现方案 2.1 前期工作 2.1.1 修改应用主题 2.1.2 获取状态栏高度 2.2 Android 5.0+ 2.2.1 设置状态栏颜色 2.2.2 设置状态栏文字颜色 2.2.3 设置状态栏透明 2.3 Android 4.4+ 2.3.1 设置状态栏颜色 2.3.2 设置状态栏透明 3. 特殊场景 3.1 启动页 3.2 弹窗 参考 1. 概述 现在市面上绝大多数APP都实现了沉浸式状态栏的效果,该效果可以极大地提升用户的使用体验。但是,APP默认的情况下只是设定一个固定的状态栏颜色,那么就需要我们通过代码去动态修改状态栏颜色的。那么,如何去实现呢? 首先来说,从Android 4.4开始才能实现沉浸式状态栏的,所以如果您的APP也支持Android 4.4以下版本,那还需要对Android 4.4以下版本做“不支持沉浸式状态栏”处理。 那么,从Android 4.4开始,大概可以分成三个阶段来实现沉浸式状态栏: Android4.4(API 19) - Android 5.0(API 21):这个阶段的实现方式为:通过FLAG_TRANSLUCENT_STATUS设置状态栏为透明并且为全屏模式,然后通过添加一个与StatusBar一样大小的View,将View的背景设置为要设置的颜色,从而实现沉浸式。 Android 5.0(API 21) -

Android View的绘制流程

夙愿已清 提交于 2019-11-29 19:50:54
Android View的绘制流程 概述: 在项目开发过程中,经常存在需要实现自定义控件的情况,对于比较简单的需要,通过组合系统提供的原生控件即可完成,但是碰到设计师脑洞大开的时候,通过简单的组合方式显然满足不了需求, 这时候往往需要技术人员自己实现控件测量、布局和绘画等操作,而这一切的前提是你需要熟练掌握View的绘制流程:   Android 中 Activity 是作为应用程序的载体存在的,它代表着一个完整的用户界面,提供了一个窗口来绘制各种视图,当Activity启动时,我们通过setContentView方法来设置一个内容视图, 这个内容视图就是用户看到的界面; 首先先了解一下Android的UI管理系统的层次关系,如下图: PhoneWindow 是Android 系统中最基本的窗口系统,每个Activity会创建一个. PhoneWindow 是Android 和View 系统交互的接口. DecorView本质是一个FrameLayout,是Activity中所有的祖先; 1.绘制的整体流程 当一个应用启动时,会启动一个主Activity,Android系统会根据Activity 的布局来对他进行绘制.绘制的会从根视图ViewRoot 的performTraversals()方法开始,从上到下遍历整个视图树, 每个View控件负责绘制自己

第八章 理解Window和WindowManager

余生长醉 提交于 2019-11-29 18:34:49
Window是一个抽象类,它的具体是现实 PhoneWindow ,通过 WindowManager 就可以创建Window。WindowManager是外界访问Window的入口,但是Window的具体实现是在 WindowManagerService 中,WindowManager和WindowManagerService的交互是一个IPC的过程。所有的视图例如Activity、Dialog、Toast都是附加在Window上的。 8.1 Window和WindowManager (1). 通过WindowManager添加View 的过程:将一个Button添加到屏幕坐标为(100,300)的位置上。 mFloatingButton = new Button( this ); mFloatingButton.setText( "test button" ); mLayoutParams = new WindowManager.LayoutParams(LaytouParams.WRAP_CONTENT,LaytoutParams.WRAP_CONTENT, 0 , 0 ,PixelFormat.TRANSPARENT); //0,0,分别是type和flags参数,在后面分别配置了。 mLaytouParams.flags = LayoutParams.FLAG_NOT