自定义view

自定义View(进度条)

匿名 (未验证) 提交于 2019-12-02 23:43:01
继承View重写带两个参数的构造方法,一个参数的不行不会加载视图,构造方法中初始化画笔这样不用没次刷新都要初始化浪费内存,在ondraw方法中绘图,invalidate方法会掉用ondraw方法重新绘制.在attrs中声明你将要设置的属性,名字要和自定义类名一样,在布局文件中引用属性,随便输入属性名然后alt+enter自动生成命名空间,就可以引用自定义属性了.最后在主activity中调用接口,使用传来的参数current public class MainActivity extends AppCompatActivity { protected void onCreate ( Bundle savedInstanceState ) { super . onCreate ( savedInstanceState ); setContentView ( R . layout . activity_main ); final CircleProgressView myView = findViewById ( R . id . circle ); ValueAnimator animator = ValueAnimator . ofFloat ( 0 , 100 ); animator . setDuration ( 4000 ); animator .

Android开发自定义View

匿名 (未验证) 提交于 2019-12-02 23:42:01
  Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容。对于Android应用的其他UI组件来说,它们都继承了View组件,然后在View组件提供的空白区域绘制外观。   当Android系统提供的UI组件不足以满足项目需求时,我们可以通过继承View并重写View类的一个或多个方法来自定义组件。   通常可以被用户重写的方法如下:     1.构造器:重写构造器是定制View的最基本的方式,当Java(或Kotlin)代码创建一个View实例或根据XML布局文件加载并构建界面时将调用该构造器。     2.onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被调用。     3.onMeasure(int,int):调用该方法来检测View组件及其所包含的所有子组件的大小。     4.onLayout(boolean,int,int,int,int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调。     5.onSizeChanged(int,int,int,int):当该组件的大小被改变时回调该方法。     6.onDraw(Canvas):当该组件将要绘制它的内容时回调该方法。     7.onKeyDown(int

Android FlowLayout流式布局

匿名 (未验证) 提交于 2019-12-02 22:56:40
最近使用APP的时候经常看到有 这种流式布局 ,今天我就跟大家一起来动手撸一个这种自定义控件. 首先说一下自定义控件的流程: 自定义控件一般要么继承View要么继承ViewGroup View的自定义流程: 继承一个View-->重写onMeasure方法-->重写onDraw方法-->定义自定义属性-->处理手势操作 ViewGroup的自定义流程: 继承一个ViewGroup-->重写onMeasure方法-->重写onLayout-->重写onDraw方法->定义自定义属性-->处理手势操作 我们可以看到自定义View和自定义ViewGroup略微有些不同,自定义ViewGroup多了个onlayout方法,那么这些方法都有什么作用呢?这里由于篇幅的问题不做过多的描述,简单的说 onMeasure:用来计算,计算自身显示在页面上的大小 onLayout:用来计算子View摆放的位置,因为View已经是最小单元了,所以没有字View,所以没有onLayout方法 onDraw:用来绘制你想展示的东西 定义自定义属性就是暴露一些属性给外部调用 好了,了解了自定义View的基本自定义流程,我们可以知道我们应该需要自定义一个ViewGroup就可以满足该需求. 首先自定义一个View命名为FlowLayout继承ViewGroup public class FlowLayout

Android中Style和Theme的使用总结

烂漫一生 提交于 2019-12-02 21:38:09
越来越多互联网企业都在Android平台上部署其客户端,为了提升用户体验,这些客户端都做得布局合理而且美观.......Android的Style设计就是提升用户体验的关键之一。Android上的Style分为了两个方面: Theme是针对窗体级别的,改变窗体样式; Style是针对窗体元素级别的,改变指定控件或者Layout的样式。 Android系统的themes.xml和style.xml(位于/base/core/res/res/values/)包含了很多系统定义好的style,建议在里面挑个合适的,然后再继承修改。 Style是View中一些属性的集合,包括height,padding,font color,background等等,Style单独定义在xml文件中,类似与web页面中css的角色,将设计和内容分开,便于修改和重复使用。 定义Style: style文件需要保存在res/values目录下,文件名任意,但是必须是xml文件,sytle文件的根标记必须是<resources>。写了一个简单示例,效果如下: main.xml文件代码: [c-sharp] view plain copy print ? <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

发送朋友圈的popupWindow

别等时光非礼了梦想. 提交于 2019-12-02 14:48:32
在我们做分享功能的时候,经常会需要自定义一些视图去实现分享,下面是根据公司的要求,写的一个popupwindow,如有不妥的地方,欢迎大家给出意见。 package com.chen.demo; import android.app.Activity; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.PopupWindow; public class MainActivity extends Activity implements OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super

SwipeRefreshLayout和RecyclerView实现下拉刷新和加载更多(当总数据不够一页,也进行了处理)

ε祈祈猫儿з 提交于 2019-12-02 13:57:59
前言:利用SwipeRefreshLayout和RecyclerView来实现下拉刷新和加载更多,有很多的例子,但普遍都存在一个问题,当总的数据不够一屏时,FooterView也显示了,如果直接隐藏FooterView,加载更多时FooterView又不显示了,捣鼓了一阵子后,总算完美的解决了,所以记录一下,同时为了方便使用,进行了一些简单的封装。 直接进入主题,关于SwipeRefreshLayout和RecyclerView的一些基本介绍,就不在这里累述,不了解的童鞋,上网查一下吧! 一、封装自己的RefreshLayout控件 为什么要封装?为了使用方便;更为了Activity简单(MVP模式);因为Adapter的数据源类型不确定,所以采用泛型来实现。 java类和xml布局如下图 仔细的童鞋,已经发现了java类继承的是LinearLayout(xml根节点),为什么不用直接继承SwipeRefreshLayout(xml根节点)呢?其实一开始也是直接已SwipeRefreshLayout为根节点的,直接以SwipeRefreshLayout为根节点,运行后发现下拉刷新的颜色无法修改(swipeRefreshLayout.setColorSchemeColors(int color)无效),而且SwipeRefreshLayout.setRefreshing(false

SwipeRefreshLayout嵌套RecyclerView实现上下拉刷新

霸气de小男生 提交于 2019-12-02 13:57:15
在这里特别感谢大神,这里附上大神帖子: https://github.com/1030310877/LoadMoreRecyclerView SwipeRefreshLayout嵌套RecyclerView实现上下拉刷新。SwipeRedreshLayout是Android自带的一个下拉刷新控件。 它有自带的下拉刷新方法setOnRefreshListener(); //下拉刷新 swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //最后清空数据,否则可能造成下标越界,但是业务要求先清空数据,所以,我在刷新数据的同时,将RecyclerView的滑动事件给拦截掉 msgList.clear(); //设置RecyclerView的滑动状态,在下拉刷新时,将RecyclerView的滑动事件给消费,连拦截 recyclerView.setRecycleScrollBug(true); //加载数据 getData("0", "20"); //判断是否下拉刷新 refreshFlag = 1; //得到刷新数据的状态 firstFlag = 0; } }); 比较简单不在赘述。只是有一点需要注意

Android自定义View之滑动取值条

*爱你&永不变心* 提交于 2019-12-02 13:47:13
Android自定义View之滑动取值条 1 : 需求 可自定义更改滑动条的样式(本功能实现两种样式) 联动方式 : 滑块上更新的值通过回调给Edittext; 在Edittext上输入值,更新滑动条的游标的位置和值 高度复合性: 可根据需求,自初始化值,及返回值的调整,显示精度的可调整性 ,超过滑动范围的可调整性 滑动取值条的取值方式: 可滑动,可点击 当值过大时,取值条上的值根据像素比例进行相应的缩放,使其显示完全 2: 实现 public CustomTakeValueArticle (Context context, AttributeSet attrs, int defStyle) { super (context, attrs, defStyle); init(context); } public CustomTakeValueArticle (Context context, AttributeSet attrs) { super (context, attrs); init(context); } 上面的代码这里只构造了两个方法 初始化init(Context context)的实现如下: /** * 初始化 * * @param context */ private void init(Context context) { mTrunkBmp =

RecyclerView 左滑(仿QQ左滑删除)

可紊 提交于 2019-12-02 13:27:41
一、效果图 二、实现步骤 1.添加依赖库 (Android/Gradle Scripts/build.gradle(Module:app)) compile 'com.android.support:recyclerview-v7:26.+' /* 版本号与 compile 'com.android.support:appcompat-v7:26.+' ,此句版本号为 26 .+ */ 2.RecyclerView布局 (activity_main.xml) <?xml version="1.0" encoding="utf-8"?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" > < android.support.v7.widget.RecyclerView android:id = "@+id/recyclerview" android:background = "#EEEEEE" android:scrollbars = "vertical" android:layout_width = "match

Android实现类似QQ的滑动删除效果

混江龙づ霸主 提交于 2019-12-02 13:16:39
观察QQ的滑动删除效果,可以猜测可以滑动删除的部分主要包含两个部分,一个是内容区域(用于放置正常显示的view),另一个是操作区域(用于放置删除按钮)。默认情况下,操作区域是不显示的,内容区域的大小是填充整个容器,操作区域始终位于内容区域的右面。当开始滑动的时候,整个容器中的所有子view都像左滑动,如果操作区域此时是不可见的,设置为可见。 我的实现思路就是自定义一个layout SwipeLayout继承自FrameLayout。SwipeLayout包含两个子view,第一个子view是内容区域,第二个子view是操作区域。滑动效果的控制,主要就是通过检测SwipeLayout的touch事件来实现,这里我不想自己去通过监听touch事件来实现滑动效果,那是一个很繁琐的过程。Android support库里其实已经提供了一个很好的工具类来帮我们做这件事情ViewDragHelper。如果你看过Android原生的DrawerLayout的代码,就会发现DrawerLayout的滑动效果也是通过ViewDragHelper类实现的。 下面先介绍一下ViewDragHelper类的使用。 首先需要在容器中创建一个ViewDragHelper类的对象。 mDragHelper = ViewDragHelper.create(this, 1.0f, new