[Android]【安卓】 将自定义View里的属性实时传递出来
本篇博客已收录到我的安卓开发小结中——点击【安卓开发小结】
1、在你的自定义View里创建一个接口。
public interface GetRGBListener{
void onRGBChanged(int red,int green,int blue);
}
2、类成员变量里声明一个这个接口的引用。
GetRGBListener getRGBListener;
3、写一个方法获取并持有Activity实现的接口的实例
public void setRGBColor(GetRGBListener getRGBListener){
this.getRGBListener = getRGBListener;
}
4、在Activity里实现这个接口,可以看到,这里使用了自定义View的RGB值
/**
* 圆环控件接口实现,获取圆环中的数据,并设置背景实时改变
*/
private RotateCircle.GetRGBListener getRGBListener = new RotateCircle.GetRGBListener() {
@Override
public void onRGBChanged(int red, int green, int blue) {
getCircleRGB(selected,red,green,blue);
setBgColor(red,green,blue,bg);
}
};
5、Activity里绑定XML里的自定义View属性,并向XML创建的自定义View对象传递Activity实现的接口对象。
@Bind(R.id.island_atmo_circle)
RotateCircle rotateCircle;
@Override
protected void initView() {
super.initView();
rotateCircle.setRGBColor(getRGBListener);
}
这样,你就可以实时获取自定义View的属性值,自定义View完整代码如下:
public class RotateCircle extends AppCompatImageView {
public RotateCircle(Context context) {
super(context);
init();
}
public RotateCircle(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RotateCircle(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
invalidate();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
return true;
case MotionEvent.ACTION_MOVE://手指移动
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
getRGBListener.onRGBChanged(r,g,b);
invalidate();
}
case MotionEvent.ACTION_UP://手指离开
break;
default:
break;
}
return super.onTouchEvent(event);
}
public interface GetRGBListener{
void onRGBChanged(int red,int green,int blue);
}
public void setRGBColor(GetRGBListener getRGBListener){
this.getRGBListener = getRGBListener;
}
}