第一次自己自定义控件,看了别人的控件,自己模仿出来一个新的,这是精简版,拓展性很差,文章最后将完全版代码附上
效果和支付宝收能量,网易星球首页钻石一样
先上效果图
1.继承 Relativelayout
public MyView(Context context)
public MyView(Context context, AttributeSet attrs)
2.在attrs中,定义属性
<declare-styleable name="MyView">
<attr name="cicleWidth" format="dimension" />
<attr name="myViewWidth" format="dimension" />
<attr name="myViewHeight" format="dimension" />
</declare-styleable>
3.在xml中,要加xmlns:app="http://schemas.android.com/apk/res-auto"
<com.luo.hellocustom.MyView
android:id="@+id/myView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cicleWidth="35dp"
/>
4.代码中,拿到属性值
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MyView);
parentWidth = typedArray.getDimension(R.styleable.MyView_myViewWidth, getScrWidth());
parentHeight = typedArray.getDimension(R.styleable.MyView_myViewHeight, getScrHeight());
拿到控件宽度,getScrWidth()是我们自己默认设置的值
5.给控件添加小球
写一个方法setList();在Activity中直接调用,等于初始化数据
//设置数据添加子小球
public void setList(List<? extends Number> list) {
this.mFloat = list;
//使用post方法确保在UI加载完的情况下 调用init() 避免获取到的宽高为0
post(new Runnable() {
@Override
public void run() {
init();
}
});
}
使用post是为了可以拿到宽高,否则为0,在post之前就需要
view = LayoutInflater.from(mContext).inflate(R.layout.view_float, this, false);
否则也拿不到值
6.小球的出现使用随机数,生成xy
Random randomX = new Random();
Random randomY = new Random();
float x = randomX.nextFloat() * (parentWidth - view.getWidth()/2);
float y = randomY.nextFloat() * (parentHeight - view.getWidth()/2);
view.setX(x);
view.setY(y);
取值在,父控件的宽度减小球半径
7,动画,小球出现时动画(渐变)
view.setAlpha(0);
view.setScaleX(0);
view.setScaleY(0);
view.animate().alpha(1).scaleX(1).scaleY(1).setDuration(2000).start();
8.小球的点击事件,我们可以加个回调
public s