自定义view

Android源码分析之理解Window和WindowManager

孤街浪徒 提交于 2019-11-29 18:32:00
Window和WindowManager概述 Window是一个抽象类,它的具体实现是PhoneWindow,创建一个Window通过WindowManager 就可以完成。WindowManager是外界访问Window的入口,它的具体实现在WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC的过程。Android中所有的视图都是通过Window来呈现的,无论是Activity,Dialog还是Toast,Window实际上是View的直接管理者。单击时间由Window传递给DecorView,然后DecorView再传递给我们的View,就连Activity设置视图的方法setContentView底层也是通过Window来完成的。 WindowManager继承于ViewManager: public interface WindowManager extends ViewManager ViewManager中有3个抽象的方法: public interface ViewManager { /** * Assign the passed LayoutParams to the passed View and add the view to the window. * <p>Throws {

如何学习uni-app?

情到浓时终转凉″ 提交于 2019-11-29 18:18:00
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架。 开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS、Android、微信小程序、H5等多个平台,保证其正确运行并达到优秀体验。 <template> <view class="content"> </view> </template> <script> export default { data: { } } </script> methods: { openinfo() { var newsid = e.currentsTarget.dataset.newsid; uni.navigateTo({ url: '../info/info?newsid='+newsid }) } } export defaults { onLoad: function(e){ uni.request({ url: ''+e.newsid, method: 'GET', data: {}, success: res => { } fail: () => {}, complete: () => {} }) } } <template> <view class="content"> <view class="title"></view> </view> </template> <rich-text class=

Android流式布局控件

久未见 提交于 2019-11-29 16:22:08
1,自定义flowlayout代码 package com.hyang.administrator.studentproject.widget; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2017/6/20. */ public class FlowGroupView extends ViewGroup { /** * 储存所有的view 按行记录 */ private List<List<View>> mAllViews = new ArrayList<List<View>>(); /** * 记录每一行的高度 */ private List<Integer> mLineHeight = new ArrayList<Integer>(); private String TAG = "TAG"; public FlowGroupView(Context

Android RecyclerView 滑动删除例子

戏子无情 提交于 2019-11-29 11:55:59
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/xiexuan2007/article/details/53156916 效果图 1.自定义Item容器View,SlidingButtonView.java package com.android.mx.myapplication; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.HorizontalScrollView; import android.widget.TextView; /** * Created by Administrator on 2016-11-11. */ public class SlidingButtonView extends HorizontalScrollView { private TextView mTextView_Delete; private int mScrollWidth;

自定义布局View

≡放荡痞女 提交于 2019-11-29 11:43:32
引入布局 如果你用过 iPhone 应该会知道, 几乎每一个 iPhone应用的界面顶部都会有一个标题栏, 标题栏上会有一到两个按钮可用于返回或其他操作(iPhone 没有实体返回键) 。现在很多的 Android程序也都喜欢模仿 iPhone的风格,在界面的顶部放置一个标题栏。虽然 Android系 统已经给每个活动提供了标题栏功能,但这里我们仍然决定不使用它,而是创建一个自定义 的标题栏。 经过前面两节的学习,我想创建一个标题栏布局对你来说已经不是什么困难的事情了, 只需要加入两个 Button 和一个 TextView,然后在布局中摆放好就可以了。可是这样做却存 在着一个问题,一般我们的程序中可能有很多个活动都需要这样的标题栏,如果在每个活动 的布局中都编写一遍同样的标题栏代码,明显就会导致代码的大量重复。这个时候我们就可 以使用引入布局的方式来解决这个问题,新建一个布局 title.xml,代码如下所示: <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android: layout_width= "match_parent" android: layout_height= "wrap_content" android: background= "@drawable

Android jetpack总结

强颜欢笑 提交于 2019-11-29 06:48:53
背景 在Android开发中经常面临的问题: (1)在应用程序(Activity、Fragment)的生命周期管理困难,尤其是Fragment的跳转带来的生命周期管理问题。 (2)在Activity需要重新创建的时候,界面控制器(View层)中存储的数据丢失,需要重新初始化,影响用户体验。 (3)Android的异步操作(DB,NetWork)时,在界面控制器(View层)被销毁后,界面控制器需要结束和任务的订阅关系,避免内存泄漏和不必要的信息回调。 (4)Android的后台服务和任务愈发困难。主要是由于Android系统的DOZE省电模式,以及后来对于后台任务和服务的限制。 (5)用户偏好设置和网络请求数据的本地存储问题。 针对以上问题,Google推出Android Jetpack框架来解决以上问题。Jetpack主要分为4个部分(下图): 基础、架构、行为、界面 。 同时Google也推出 AndroidX 库,AndroidX 是对support library的重大改进。在AndroidX中将所有软件包名都以字符串**androidx.**开头,位于一致的命名空间中。 使用Android Jetpack组件的优势: (1)Lifecycles轻松管理应用程序的生命周期。 (2)LiveData构建可观察的数据对象,以便在基础数据更改时通知视图。 (3

android View点击事件分发流程

跟風遠走 提交于 2019-11-29 03:56:08
android View事件分发流程 android 中的view虽然不是四大组件,但是同样也是相当重要的。不论是我们在平时自定义控件还是面试的时候总会遇到一些关于view点击事件分发的一些问题。接下来就让我给大家分享一下关于view的事件分发流程。 要想了解view的事件分发首先我们要知道什么是事件分发?所谓点击事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递到具体的View,而这个传递的过程就是事件分发的过程。点击事件的分发过程有三个很重要的方法共同完成:dispatchTouchEvent、onInterceptTouchEvent、和onTouchEvent,下面我们先介绍一些这几个方法: public boolean dispatchTouchEvent(MotionEvent ev) 用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。 public boolean onInterceptTouchEvent(MotionEvent ev) 在上述方法内部调用,用来判断是佛偶拦截某个事件,如果当前View拦截了某个事件

源码解析Android中的事件处理

强颜欢笑 提交于 2019-11-29 03:54:49
一,事件处理 Android提供了两套事件处理机制: 1.基于监听的事件处理。 2.基于回调的事件处理。 基于回调的事件处理用于处理一些具有通用性的事件,基于监听的事件处理用于处理与具体业务相关的事件。 基于监听的事件处理 基于监听的事件处理是在指定view组件上绑定指定的监听器。比如点击事件: 可以以匿名内部类形式绑定监听器: button.setOnClickListener( new View.OnClickListener() { @Override public void onClick (View view) { } }); 或者: // Create an anonymous implementation of OnClickListener private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { // do something when the button is clicked } }; protected void onCreate(Bundle savedValues) { ... // Capture our button from layout Button button = (Button)findViewById(R

Yii2 GridView自定义链接之重写 ActionColumn

痞子三分冷 提交于 2019-11-29 01:39:53
最近刚开始用yii2,真是超棒的,但是也有许多不足的地方,今天要说的就是GridView链接问题。 <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'username', 'email', ['class' => 'yii\grid\ActionColumn'], ], ]); ?> 这是一个最简单的默认 GridView,gii生成的就这样,那么问题来了。 如果用户管理不是独立的控制器,而是在user控制器或者是site控制器下,ActionColumn默认链接却是view, update, delete 但是我想要的却是 user-view, user-update, user-delete 这样的链接,然后我修改了下,代码如下。 <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'username'

drf框架(二)

这一生的挚爱 提交于 2019-11-29 00:41:33
drf框架安装 >: pip install djangorestframework drf框架规矩的封装风格 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.request import Request from rest_framework.filters import SearchFilter from rest_framework.pagination import PageNumberPagination from rest_framework.exceptions import APIException from rest_framework.authentication import BaseAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.throttling import SimpleRateThrottle from rest_framework.settings import APISettings from rest_framework import status