android自定义view之---组合view
最近工作比较轻松,没有什么事情干,于是进入高产模式(呃。。。。高产似xx)。
应该很多童鞋对自定义view这个东西比较抵触,可能是听网上说view比较难吧,其实自定义view并没有很难
自定义view分为三种
1.自绘view
2.组合控件view
3.重写系统view
今天我们就来以一个小例子讲一下自定义view中的组合控件view,所谓的组合控件view就是使用系统预设的view来进行组合成一个新的view。并不进行图形的绘制操作。好了,今天的目标是把之前用Animation实现的loading动画做成一个view来使用,如果你还不了解Animation动画 可以去开开这篇博客:动画介绍--Animation
实现loading动画效果
老规矩,先上效果图:
可以看到效果跟上篇博客差不多,但是现在他可是一个view。我们首先来看一下布局文件:
<?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">
<com.wingsoft.loadinganimation.LoadingView
android:id="@+id/loading"
android:layout_width="300dp"
android:layout_centerInParent="true"
android:layout_height="300dp">
</com.wingsoft.loadinganimation.LoadingView>
<Button
android:id="@+id/button_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="cancel"/>
</RelativeLayout>
这是主布局文件, 一个相对布局,一个按钮。 看到其中一个控件是带包名的,说明这个控件是我们自定义的控件。
由于我们今天介绍的是控件组合view,所以新建一个类让他继承于FrameLayout
public class LoadingView extends FrameLayout {
private ImageView mImageView;
private TextView mTextView;
private AnimationSet mImageAni = new AnimationSet(true);
private AnimationSet mTextAni = new AnimationSet(true);
public LoadingView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.loading_view,this);
mImageAni = new AnimationSet(true);
mTextAni = new AnimationSet(true);
mImageView = (ImageView) findViewById(R.id.loadingView_point);
mTextView = (TextView) findViewById(R.id.loadingView_loading);
TranslateAnimation ta = new TranslateAnimation(100, 0, 200, 0);
ta.setDuration(5000);
RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(5000);
mImageAni.addAnimation(ta);
mImageAni.addAnimation(ra);
ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(5000);
AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(5000);
mTextAni.addAnimation(sa);
mTextAni.addAnimation(aa);
aa.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mTextView.startAnimation(mTextAni);
mImageView.startAnimation(mImageAni);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
public void start(){
mTextView.startAnimation(mTextAni);
mImageView.startAnimation(mImageAni);
}
public void stop(){
mTextView.clearAnimation();
mImageView.clearAnimation();
}
}
关键点在于 实现一个两个参数的构造器。在构造器里面调用LayoutInflater 将布局文件转换成view; 之后再给我们的view 添加两个方法 一个是start(),一个是stop() 用来控制动画是否播放。这样便完成了view的编写。下面在MainActivity中对他进行操作。
public class MainActivity extends ActionBarActivity {
private LoadingView mLoadingView;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLoadingView = (LoadingView) findViewById(R.id.loading);
mButton = (Button)findViewById(R.id.button_cancel);
mLoadingView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mLoadingView.start();
}
});
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mLoadingView.stop();
}
});
}
}
可以看到,我们可以像使用系统控件一样使用这个view了,怎么样,很神奇吧。你也快试试!之后我们会介绍自绘view。
android自定义view之---组合view的更多相关文章
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu
示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...
- android自定义View_3——Optimizing the View
前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...
- android自定义View_2——Making the View Interactive
前言:绘制出一个view只是自定义view的一个部分,还需要自定义一些view的行为,来反馈用户的使用操作,反馈的 行为要合理性,就像真是的物理世界一样,不要太玄幻哦. 可以将view的行为封装到in ...
- Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置
以自定义ImageView为例: /** * 可拖拽ImageView * Created by admin on 2017/2/21. */ public class FloatingImageVi ...
- Android自定义组件之自动换行及宽度自适应View:WordWrapView
目的: 自定义一个ViewGroup,里面的子view都是TextView,每个子view TextView的宽度随内容自适应且每行的子View的个数自适应,并可以自动换行 一:效果图 二:代码 整 ...
- Android 自定义View合集
自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...
- Android自定义View的实现方法,带你一步步深入了解View(四)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回 ...
- [原] Android 自定义View步骤
例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...
随机推荐
- Objective-C 中如何测量代码的效率
背景 在我们编程的时候,可能经常会有一些疑问: * 我们写的某个方法的执行效率是多少? * 方法 A 和 方法 B 哪个更快? 因此,我们不可避免的要用到一些方法来计算代码的执行效率.计算代码的执行效 ...
- 在一维坐标轴上有n个区间段,求重合区间最长的两个区间段。
//重叠区间数 #define N 2 typedef struct arrange { int x; int y; } Arrange; //先按左边界排序,若相等再按右边界排序(升序) int c ...
- Servlet - 基础
Servlet 标签 : Java与Web HTTP协议 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器(Browser)和万维网服务 ...
- EBS开发技术之trace
trace的目的 trace主要是用于程序调优,优化,程序bug调试,程序运行系统情况跟踪 trace步骤 1.并发定义中,勾上"启用跟踪" 2.提交一个请求,得到请求编号 注意: ...
- 破解Oracle ERP 密码
1. 写作目的 1 2. 利用Toad或其它pl/sql工具在Oracle ERP Database中建立Package,源码如下 1 (1). ...
- SpriteKit给游戏弹跳角色添加一个高度标示器
这是一个类似于跳跃涂鸦的小游戏,主角不断吃能量球得到跳跃能量向更高的地方跳跃,如果图中碰到黑洞就挂了- 在游戏调试过程中如果能实时知道主角的高度就好了,这将有助于程序猿动态的判断游戏胜败逻辑. 你可以 ...
- maven配置详解
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...
- Centos7安装Tair及配置测试
系统环境 Centos7 64位 外网ip 182.254.145.66 内网ip 10.105.23.114 安装位置 /usr/local/tair Tair介绍 参见官网 安装 想了半天,我还是 ...
- PGM:概率图模型Graphical Model
http://blog.csdn.net/pipisorry/article/details/51461878 概率图模型Graphical Models简介 完全通过代数计算来对更加复杂的模型进行建 ...
- Portlet开发入门实例
1原生Portlet开发 这是最简单.最本质的开发方式,直接基于Portlet规范定义的接口开发Portlet.优点是贴近底层比较灵活, 缺点当然就是所有事情都要自己去做.就好比不用SpringMVC ...