自定义view

公共技术点之 Android 动画基础

让人想犯罪 __ 提交于 2019-12-03 00:37:54
一 传统 View 动画(Tween/Frame) 1.1 Tween 动画 主要有 4 中:缩放、平移、渐变、旋转 文件位置: res/anim/filename.xml 编译资源的数据类型:an Animation 资源引用: Java: R.anim.filename XML: @[package:]anim/filename <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" />

ReactNative常用组件之ParallaxScrollView

匿名 (未验证) 提交于 2019-12-03 00:37:01
看效果: 首先安装第三方组件: npm install react -native -parallax -scroll -view 做了一个简单的封装 看代码: import React, {Component} from 'react' ; import { Dimensions, Image, ListView, PixelRatio, StyleSheet, Text, View, Platform, ToastAndroid, TouchableHighlight } from 'react-native' ; import ParallaxScrollView from 'react-native-parallax-scroll-view' ; const instructions = Platform.select({ ios : 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu' , android : 'Double tap R on your keyboard to reload,\n' + 'Shake or press menu button for dev menu' , }); export default class AboutComponent { /** *

CircularFloatingActionMenu 源码解析

孤街浪徒 提交于 2019-12-03 00:35:22
1. 功能介绍 一个与著名应用 Path 菜单类似的圆形弹出菜单,可方便的定制菜单以及动画。 菜单可能是非完整圆形,本文统称为 圆形菜单 。 1.1 特点 可自定义动画、菜单、角度范围、半径等。 1.2 概念 以上是简单的圆形弹出菜单示例,更详细的示例图见: Screenshot 。 菜单按钮(Event): 点击会弹出圆形菜单的控件,如上图的 + 对应控件,对应代码中的 FloatingActionButton.java 。 子菜单按钮(Event): 圆形菜单中的控件,如上图的定位、视频、相机、文本对应的控件,对应代码中的 SubActionButton.java 。 菜单: 整个菜单,包含上面的 菜单按钮 和 子菜单按钮 ,对应代码中的 FloatingActionMenu.java 。 菜单动画回调: 点击 菜单按钮 弹出 子菜单按钮 的动画设置的抽象类,对应代码中的 MenuAnimationHandler.java 。 2. 总体设计 本项目较为简单,总体设计省略。 3. 流程图 流程图如上图所示,中间最复杂的可能是计算 子菜单按钮 位置的地方。 4. 详细设计 4.1 类关系图 以上是 CircularFloatingActionMenu 主要类的关系图。 FloatingActionButton 、 SubActionButton 都是继承自 FrameLayout

touchWX 自定义组件以及传值

匿名 (未验证) 提交于 2019-12-03 00:34:01
创建如图文件 index.wxc: <template> <view class="wx-test" bindtap="handleTap"> {{ msg }}{{dataIndex}} </view> </template> <script> export default { properties: { dataIndex: { type: String, value: ‘default value‘, } }, data: { msg: ‘This is a test msg!‘ }, methods: { handleTap() { var a=123 this.triggerEvent(‘myclick‘,a); } } } </script> <style lang="less"> .wx-test { color: #f00; } </style>   父组件: 原文:https://www.cnblogs.com/smzd/p/9223830.html

PagerSlidingTabStrip 源码解析

让人想犯罪 __ 提交于 2019-12-03 00:33:51
1. 总体设计 pagerSlidingTabStrip 实现联动效果的原理是,它引用了 ViewPager 的 OnPageChangeListener 。 但是 viewpager 注册的 listener 不是自身的 OnPageChangeListener ,而是 pagerSlidingTabStrip 内部类 PageListener 。 通过 PageListener 实现对对 viewpager 和 tab 的封装。从而实现滑动联动效果。 可以设置 tab 的类型为 textview 还是 icon。对于 textview 可设置字库属性。 通过提供方法如滑动指示器 下划线 tab 风格线 tab 权重等达到自定义的效果。 2. 流程图 3. 功能介绍 3.1 特性介绍 兼容 Android 支持库中的 ViewPager 的一个滑动分页指示器的控件。 滑动时实现 TextView 颜色状态的联动 支持文字导航指示,可指定选中的 pager 导航字体属性 支持图片导航指示,可高亮选中 pager 页导航背景 很好的扩展性 3.2 集成及使用指南 3.2.1 在 gradle 中 dependencies { compile 'com.astuetz:pagerslidingtabstrip:1.0.1' } 3.2.2 在 layout 布局文件中引入

Android MeasureSpec理解

匿名 (未验证) 提交于 2019-12-03 00:32:02
MeasureSpec字面意思为测量的规格,他决定了view的测量过程 接下来探讨几个问题来学习MeauseSpec 1. MeasureSpec的构成 2. 如何创建MeasureSpec 3. 默认View的OnMeasure过程中对MeasureSpec的处理 MeasureSpec代表一个32位的int值,前俩位代表SpecMode,后30位代表SpecSize.其中:SpecMode代表测量的模式,SpecSize值在某种测量模式下的规格大小。 共有三种测量模式: 1. EXACTLY: 父容器已经检测出子View所需要的精确大小,这个时候view的大小即为SpecSize的大小,他对应于布局参数中的MATCH_PARENT,或者精确大小值 2.AT_MOST: 父容器指定了一个大小,即SpecSize,子view的大小不能超过这个SpecSize的大小 3.UNSPECIFIED: 表示子View想多大都可以 MeasureSpec内部提供了创建MeasureSpec的方法: public static int makeMeasureSpec ( int size, int mode) { if (sUseBrokenMakeMeasureSpec) { return size + mode; } else { return (size & ~MODE_MASK) |

Android架构模式三:MVVM

匿名 (未验证) 提交于 2019-12-03 00:30:01
原文地址: https://upday.github.io/blog/model-view-viewmodel/ 在开发upday应用的前六个月中,经过四次不同设计,我们学到了一个重要的教训:我们需要一个能及时相应设计变化的架构!最终我们选择的解决方案是MVVM。和我一起来探索下什么是MVVM;我们是如何在upday中应用它的以及是什么使得它对我们而言是如此完美地适合。 MVPģʽ MVVM的主要参与者是: View -向ViewModel报告用户行为 ViewModel -公开与View相关的数据流 DataModel -抽象的数据源。ViewModel与DataModel协作以获取和保存数据。 乍一看,MVVM似乎与MVP模式非常接近,因为两者在抽象View的状态和行为方面都做得非常好。MVP抽象了一个独立于特定平台用户界面的View,而MVVM则是为了简化编写事件驱动的用户界面而创建的。 如果MVP是由Presenter直接告知View显示什么,那在MVVM中,ViewModel暴露View可以绑定到的事件流。这样,ViewModel就不需要像Presenter一样再持有View的引用。这也意味着MVP模式所需的所有接口现在都被丢弃了。 View同样也会通知ViewModel不同的用户行为。MVVM模式支持View和ViewModel之间的双向数据绑定

微信小程序自定义Dialog

匿名 (未验证) 提交于 2019-12-03 00:30:01
自定义组件,因为小程序是 MVVM 是数据驱动,所以,把所有的控制流程、动态流程的数据(即自变量)都交给组件的调用方,随着调用方 setData 使元数据改变来驱动控制流程、动态流程(因变量)的变化,如 Dialog的显示和隐藏是因变量,而控制 Dialog 的显示状态的量则是因变量。 类似于页面,一个自定义组件由 json wxml wxss js 4个文件组成。 要编写一个自定义组件,首先需要在 json 文件中进行自定义组件声明: { " component ": true , " usingComponents ": {} } 还要在 wxml 文件中编写组件模版: <!--components/dialog/dialog.wxml--> < view class = 'wx_dialog_container' hidden = " {{! isShown }} " > < view class = 'wx-mask' > </ view > < view class = 'wx-dialog' > < view class = 'wx-dialog-title' > {{ title }} </ view > < view class = 'wx-dialog-content' > {{ content }} </ view > < view class = 'wx

自定义View

匿名 (未验证) 提交于 2019-12-03 00:30:01
View下面有 ImageView ImageButton QuickContactBadge AppCompatImageView TextView EditText Button RadioButton ToggleButton CheckBox Switch TextClock Chronometer RowHeaderView ViewGruop LinearLayout ReativeLayout ViewPager AbsoiuteLayout FrameLayout GridLayout TextureView ViewStub TabLtem Spce 一.新建一个类继承View package com.example.myapplication.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.os.Build;

Android 使用ExoPlayer视频播放 (二)

匿名 (未验证) 提交于 2019-12-03 00:27:02
创建缓存文件夹 public class CachesUtil { public static String VIDEO = "video" ; /** * 获取媒体缓存文件 * * @param child * @return */ public static File getMediaCacheFile (String child) { String directoryPath = "" ; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 外部储存可用 directoryPath = MyApplication.getContext().getExternalFilesDir(child).getAbsolutePath(); } else { directoryPath = MyApplication.getContext().getFilesDir().getAbsolutePath() + File.separator + child; } File file = new File(directoryPath); //判断文件目录是否存在 if (!file.exists()) { file.mkdirs(); } LogUtil.d(TAG,