自定义view

ViewDragHelper详解

非 Y 不嫁゛ 提交于 2019-12-27 15:22:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动。 ViewDragHelper是framework中不为人知却非常有用的一个工具 。 ViewDragHelper解决了 Android 中手势处理过于复杂的问题,在DrawerLayout出现之前,侧滑菜单都是由第三方开源代码实现的,其中著名的当属 MenuDrawer ,MenuDrawer重写onTouchEvent方法来实现侧滑效果,代码量很大,实现逻辑也需要很大的耐心才能看懂。如果每个开发人员都从这么原始的步奏开始做起,那对于安卓生态是相当不利的。所以说ViewDragHelper等的出现反映了安卓开发框架已经开始向成熟的方向迈进。 本文先介绍ViewDragHelper的基本用法,然后介绍一个能真正体现ViewDragHelper实用性的例子。 其实ViewDragHelper并不是第一个用于分析手势处理的类,gesturedetector也是,但是在和拖动相关的手势分析方面gesturedetector只能说是勉为其难。 关于ViewDragHelper有如下几点:

对话框

折月煮酒 提交于 2019-12-27 01:07:11
package com.example.myapplication1; import android.app.DatePickerDialog; import android.app.ProgressDialog; import android.app.TimePickerDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.ImageView; import android.widget.TimePicker; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import java.util.Calendar; import java.util.Timer; import java.util

Android专高一 12月26日

假如想象 提交于 2019-12-27 00:42:13
一、确定取消选择对话框 // 单选对话框 public void simple_dialog ( View view ) { //构建者 AlertDialog . Builder builder = new AlertDialog . Builder ( this ) ; //设置属性 builder . setIcon ( R . mipmap . ic_launcher_round ) ; builder . setTitle ( "单选对话框" ) ; builder . setPositiveButton ( "OK" , new DialogInterface . OnClickListener ( ) { @Override public void onClick ( DialogInterface dialog , int which ) { Toast . makeText ( MainActivity . this , "你点击了OK" , Toast . LENGTH_SHORT ) . show ( ) ; } } ) ; builder . setNegativeButton ( "cancel" , new DialogInterface . OnClickListener ( ) { @Override public void onClick (

小程序自定义组件通信

送分小仙女□ 提交于 2019-12-26 01:25:34
小程序自定义组件 小程序的自定义组件和页面一样由 json wxml wxss js 4个文件组成。首先要在组件的json文件里面加入"component": true,表示将这个文件设置为自定义组件。然后在全局app.json里面加入 "usingComponents": { "component-tag-name": "path/to/the/custom/component" } 这样就完成了组件的注册,我们在所有页面都可以调用这个组件了。(component-tag-name表示组件名,path/to/the/custom/component表示组件的相对路径)。下面我们就讲讲组件与页面之间的通信: 一.页面向组件传值: 页面传值 在页面.wxml里面加入组件如:.。其中reason和advice是我们想传给组件的值,bindmyevent这个事件我们下面会讲到。 组件接收值 小程序提供了组件的属性列表properties,里面存放从页面传过来的参数 properties : { reason : { type : String , value : 'default value' , } , advice : { type : String , value : 'default value' , } } , type表示传过来值的类型,value可以设置默认值

关于自定义View的理解

喜你入骨 提交于 2019-12-25 18:23:30
概述 关于自定义View,看到一篇文章,思路清晰,帮到了我,想说记录下来,总结下 Android中View框架的工作机制中,主要有三个过程: 1、View树的测量(measure) Android View框架的measure机制 2、View树的布局(layout) Android View框架的layout机制 3、View树的绘制(draw) Android View框架的draw机制 View框架的工作流程为:测量每个View大小(measure)-->把每个View放置到相应的位置(layout)-->绘制每个View(draw)。 开发人员在绘制UI的时候,基本都是通过XML布局文件的方式来配置UI,而每个View必须要设置的两个群属性就是layout_width和layout_height,这两个属性代表着当前View的尺寸。 所以这两个属性的值是必须要指定的,这两个属性的取值只能为三种类型: 1、固定的大小,比如100dp。 2、刚好包裹其中的内容,wrap_content。 3、想要和父布局一样大,match_parent / fill_parent。 由于Android希望提供一个更优雅的GUI框架,所以提供了自适应的尺寸,也就是 wrap_content 和 match_parent 。 试想一下,那如果这些属性只允许设置固定的大小

安卓开发电商mvp框架和流式布局,搜索框

假如想象 提交于 2019-12-24 10:19:23
在我看来mvp框架其实是mvc框架变种产品。讲原本的activity/fragment的层次划分成present层和view层。m还是原来的实体层用来组装数据,p层则用来隔离view层,被称为中介层,v层还是view层主要用来展示数据的层。如下图所示: 有了present层之后呢?view层就专心在activity/fragment里面主要去处理视图层和维护自己的生命周期,将业务逻辑委托给present层,present层作为实体层和视图层的中介。实体层和视图层不直接进行交互,而是通过委托给persent层进行交互,这样做的好处是: 分离了视图逻辑和业务逻辑,降低了耦合 Activity只处理生命周期的任务,代码变得更加简洁 视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性 Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试 把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM 方便代码的维护和单元测试。 以下主要展示的功能和框架有: MVP架构+基类+Volley封装 底部标签与Fragment的联动 arguments动态传值 接口回调 js交互,有参无参调用,弹框 自定义全局异常捕获 base封装Activity和Fragment

android尺子的自定义view——RulerView

对着背影说爱祢 提交于 2019-12-24 02:56:40
项目中用到自定义尺子的样式: 原代码在github上找的,地址:https://github.com/QQabby/HorizontalRuler 原效果为 因为跟自己要使用的view稍有不同 所以做了一些修改,修改的注释都放在代码中了,特此记录一下。 首先是一个自定义View: 1 public class RuleView extends View { 2 3 private Paint paint; 4 5 private Context context; 6 7 private int maxValue = 500; 8 /** 9 * 起点x的坐标 10 */ 11 private float startX ; 12 13 private float startY ; 14 /** 15 * 刻度线的长度 16 */ 17 private float yLenght ; 18 /** 19 * 刻度的间隙 20 */ 21 // private float gap = 8f; 22 private float gap = 10; 23 /** 24 * 文本的间隙 25 */ 26 private float textGap = 10f; 27 /** 28 * 短竖线的高度 29 */ 30 private float smallHeight = 10f; 31 /**

微信小程序自定义底部导航栏组件+跳转

我与影子孤独终老i 提交于 2019-12-24 00:20:13
案例一: https://www.cnblogs.com/liao123/p/11005796.html 很精彩的案例,值得看一下(重点是要知道原理) 案例二: 接合微信小程序开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 详见 官网代码见上面圈红的开发者工具预览效果。 使用该方法需要使用到: if ( typeof this . getTabBar == = 'function' && this . getTabBar ( ) ) { this . getTabBar ( ) . setData ( { selected : 0 } ) } 但 :个人不建议使用这种方法(案例二), 建议使用自定义导航栏组件,隐藏原生的导航栏(在app.js中的onLaunch使用wx.hideTabBar()去隐藏) , 方法如案例三 还有如果使用案例二的导航栏的话,需要注意官方文档的这个要求,需要把版本库提高 另外也不使用cover-view + cover-image,因为会因为各种版本库的原因导致各种无法预料的错误。 案例三:个人自定义导航栏简单代码: 效果图: 步骤1:custom-tab-bar(即组件) 文件下: // index.js

Android中ListView的各种显示效果

淺唱寂寞╮ 提交于 2019-12-23 20:58:30
在android应用开发中,ListView是使用频率非常高的一个组件,基本上稍微复杂点的布局都会用到它,利用它可以让你的界面美观,有层次 。ListView可以用来作为数据显示的容器,也可以作为界面的布局。学习ListView需要关注的内容大概有三点:显示、数据适配器以及各种 事件的监听器。内容有点多,这里先只讲如何让ListView达到你想要的显示效果。 一、普通的ListView 普通的ListView是指每一个item只显示一条文本数据,程序运行效果图如下: 代码: protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.layout_listview_simple); //取得ListView实例 ListView lvwSimple = (ListView)findViewById(R.id.lvw_simple); //要在ListView中显示的数据集合 String items[] = new String[] {"item1", "item2", "item3", "item4", "item5"}; /

Android 自定义View之能力分析图

感情迁移 提交于 2019-12-21 03:00:57
MainActivity //能力分析图 AbilityAnalysisView abilityView = ( AbilityAnalysisView ) findViewById ( R . id . abilityAnalysisView_id ) analysisView . setDataCount ( 5 ) . setTitles ( new String [ ] { "伤害" , "防御" , "攻速" , "吸血" , "助攻" } ) . setDatas ( new float [ ] { 170 , 120 , 90 , 210 , 120 } ) //TODO 赋值相应的各维度分值,数据最大值maxValue在自定义View里可以更改 . setColors ( new int [ ] { R . color . colorOrange4 , R . color . colorOrange3 , R . color . colorOrange2 , R . color . colorOrange1 , R . color . colorOrange5 } ) . invalidate ( ) ; //TODO 坑更新自定义View 调用OnDraw方法 activity_main.xml < ? xml version = "1.0" encoding =