目的
掌握Android开发中最基础的自定义属性方法,自定义:PageController属性,里面含有:mPadding属性,resourceID属性,numberOfPagese属性
相关技术、及其使用
1、自定义属性:
(1)、创建一个values资源文件
(2)、使用declare-styleable关键字修饰
(3)、name值为自己定义的类的类型
(4)、添加属性 attr name 和对应值的类型 format(如果有多个类型用 | 隔开) (自定义属性在xml中使用)
自定义属性:
<resources>
<!--声明在那个控件上添加属性-->
<declare-styleable name="PageController">
<attr name="mPadding" format="integer"/>
<attr name="resourceID" format="reference|color"/>
<attr name="numberOfPages" format="integer"/>
</declare-styleable>
</resources>
调用属性:
<swu.ht.java.customattr.PageController
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:padding="20"
app:numberOfPages="5"
app:resourceID="@drawable/dot_shape"/>
2、创建PageController类继承于LinearLayout,实现三个PageController方法
(1)创建私有变量:numberOfPage,resourceID,padding ,currentPage
public PageController(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER);
/*
将xml里面自定义属性的值取出来
*/
if(attrs != null){
/*从一个资源文件里面去将自定义的所有属性取出来
1、AttributeSet xml里面配制的所有属性
2、自定义的属性文件 R.styleable.name
*/
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.PageController);
/* 需要传参数
1、自定义属性名 自定义属性name_属性名
2、默认值(xml 文件里面没有设置就默认)
*/
padding = typedArray.getInt(R.styleable.PageController_mPadding,0);
resourceID = typedArray.getResourceId(R.styleable.PageController_resourceID,0);
int page = typedArray.getInt(R.styleable.PageController_numberOfPages,0);
//显示
setNumberOfPages(page);
}
}
(2)调用setNumberOfPage方法
public void setNumberOfPages(int numberOfPages) {
this.numberOfPages = numberOfPages;
//创建点
for(int i = 0; i < numberOfPages;i++){
//创建控件ImageView
ImageView dotView = new ImageView(getContext());
//设置显示的内容
dotView.setBackgroundResource(resourceID);
//设置约束
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER_VERTICAL;
//除第一个点外,依次给后面的点之间添加间距
if(i > 0 ){
params.leftMargin = padding;
}else {
//默认选择第一个点
dotView.setEnabled(false);
}
//添加到容器中
addView(dotView,params);
}
}
(3)调用onTouchEvent方法实现触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
//取出当前页数
int current = currentPage;
//实现左右点击切换
if(event.getX() > getWidth()*0.5){
//右边
if(current == numberOfPages-1){
current = 0;
}else {
current++;
}
}else {
//左边
if(current == 0){
current = numberOfPages-1;
}else {
current--;
}
}
setCurrentPage(current);
}
return true;
}
(4)调用SetCurrentPage还原上一次的默认状态
public void setCurrentPage(int currentPage) {
//将上一次的还原为默认状态
ImageView old = (ImageView)getChildAt(this.currentPage);
old.setEnabled(true);
//将当前选中的设置为选中状态
ImageView current = (ImageView)getChildAt(this.currentPage);
current.setEnabled(false);
this.currentPage = currentPage;
//将页数改变的事件回调给监听者
if(mpageChangeListener != null){
mpageChangeListener.pageDidChanged(currentPage);
}
showAnimation(current);
}
(5)定义接口监听指示器改变事件,并实现拉伸动画
public interface PageChangeListener{
void pageDidChanged(int currentPage);
}
//mPageChangeListener
//设置监听对象
public void addPageChangeListener(PageChangeListener listener){
this.mpageChangeListener = listener;
}
/*
宽度拉伸的动画
关键帧动画 补间动画 属性动画(ObjectAnimator)
*/
public void showAnimation(ImageView item){
ObjectAnimator scale = ObjectAnimator.ofFloat(item,"scaleX",1,1.5f,1);
scale.setDuration(400);
scale.start();
}
PS
自定义属性主要就是在value里面定义属性,然后在xml配置文件中进行调用。
网友评论