这里就用到了java中所学的重载
下面是代码:
public class MyView extends View{ private int height;
private int width;
private int x;
private int y;
private int mRadius=100;
private double sqrt;
private int xx;
private int yy;
private boolean onBall; //在代码中使用自定义控件(new MyView也就是动态创建对象),自动回调此方法;
public MyView(Context context) {
this(context,null);//此处修改
}
//XML布局使用此自定义控件,自动回调此方法;(也就是在XML中利用包名.类名来写这个自定义控件)
public MyView(Context context, AttributeSet attrs) {
this(context,null,0);//此处修改
}
//XML布局中使用此自定义控件,且带有样式,自动回调;
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
//自定义控件初始化操作
private void initView() {
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//获取当前空间的宽和高
height = this.getHeight();
width = this.getWidth();
//获取屏幕的正中心点
x = width / 2;
y = height / 2;
}
//此方法进行绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GREEN);
//画圆,根据需要的参数,来给他设置
canvas.drawCircle(x,y,mRadius,paint);
}
//使用触摸事件来实现小球拖动
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN://按下
xx = (int)event.getX();
yy = (int)event.getY();
//判断用户手是否点击在圆上
onBall = isOnBall(xx, yy);
break;
case MotionEvent.ACTION_MOVE://移动
//进行判断用户手机是否在圆上
if (onBall){
x = (int)event.getX();
y = (int)event.getY();
//时时回调onDrawer方法
postInvalidate();
} break;
case MotionEvent.ACTION_UP://松开 break;
}
return true;
} private boolean isOnBall(int xx, int yy) {
//勾股定理,得到按下的半径
sqrt = Math.sqrt((xx - x) * (xx - x) + (yy - y) * yy - y);
//对应圆的半径和按下半径进行判断,看用户的手是否点在圆上
if (sqrt<=mRadius){
return true;
}
return false;
}
}
public class MyView extends LinearLayout implements View.OnClickListener {
private ImageView image1;
private ImageView image2;
private TextView textView;
private View inflate;
private String trim;
//创建对象对象时回调(也就是在java代码中用的时候回调)
public MyView(Context context) {
//super(context);
this(context,null);
}
//在XML中使用的时候调用
//AttributeSet 是接收xml中定义的属性信息,这不一定是自定义布局,
//不是自定义布局也有该属性,要不xml中定义的属性信息就无法接收了。
public MyView(Context context, AttributeSet attrs) {
//super(context, attrs);
this(context,attrs,0);
}
//在XML中使用,且使用style风格中
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化布局
initView(context);
}
private void initView(Context context) {
//把一个布局文件实例化,并且加载到MyView类中
inflate = View.inflate(context, R.layout.myview, this);
image1 =(ImageView)inflate.findViewById(R.id.image1);
image2 =(ImageView)inflate.findViewById(R.id.image2);
textView =(TextView)inflate.findViewById(R.id.textView);
image1.setOnClickListener(this);
image2.setOnClickListener(this);
//获取Value值;
int value=getvalue();
//设置value的值
setvalue(value);
}
//Imageview的点击事件
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.image1://减
subNumber();
break;
case R.id.image2://加
addNumber();
break;
}
}
//加
private void addNumber() {
if (valuemyMin){
value--;
}
setvalue(value); } private int myMax;
private int myMin; public void setMax(int Max){
myMax=Max;
}
public void setMin(int Min){
myMin=Min;
}
//当前数量值,默认为1,设置对此值得获取
private int value=1;
public int getvalue() {
//从textView中获取到值,并进行强转
trim = textView.getText().toString().trim(); if (!TextUtils.isEmpty(trim)){
value=Integer.valueOf(trim);
}
return value;
}
//设置值
public void setvalue(int value) {
this.value = value;
textView.setText(value+"");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my=(MyView)findViewById(R.id.my);
my.setMax(5);
my.setMin(1);
//经过我们的观察;发现这个标题是是随着顶部图片高度关系,颜色变浅变深
public class MainActivity extends AppCompatActivity implements MyScrollView.ScrollViewListensr { private int mImageHeight;
private ImageView mIvDetail;
private TextView mTvTitlebar;
private RelativeLayout mLayoutTitle;
private MyScrollView myScrollView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myScrollView = (MyScrollView) findViewById(R.id.scrollView);
mIvDetail = (ImageView) findViewById(R.id.iv_detail);
mTvTitlebar = (TextView) findViewById(R.id.tv_titlebar);
mLayoutTitle = (RelativeLayout) findViewById(R.id.layout_title);
//获取顶部图片的高度
initListener();
//设置scrollview的滚动监听,一般滑动时,最上面的标题显示,
myScrollView.setScrollViewListener(this);
}
//获取顶部的图片高度,设置scrollview的滚动监听是,要使用这个参数
private void initListener() {
//获取控件的试图观察者,以便通过试图观察者得到空间的宽高参数
ViewTreeObserver viewTreeObserver = mIvDetail.getViewTreeObserver();
//使用试图观察者设置监听,一边获取所观察空间的高度
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//卸磨杀驴,回调监听后,第一件事就是移除该监听,减少内存消耗
mIvDetail.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//得到控件高度
mImageHeight = mIvDetail.getHeight();
}
});
} @Override
public void onScrollChanged(MyScrollView myScrollView, int l, int t, int oldl, int oldt) {
if (t <= 0) {
//设置标题隐藏
mTvTitlebar.setVisibility(View.GONE);
//设置标题所在背景为透明
mLayoutTitle.setBackgroundColor(Color.argb(0, 0, 0, 0));
} else if (t > 0 && t < mImageHeight) {
//让标题显示出来
mTvTitlebar.setVisibility(View.VISIBLE);
//获取scrollview向下滑动,图片消失部分的比例
float aFloat = (float) t / mImageHeight;
//根据这个比例,让标题的颜色慢慢的由浅入深
float alpha = 255 * aFloat;
//设置标题的内容颜色
mTvTitlebar.setText("我最帅");
mTvTitlebar.setTextColor(Color.argb((int) alpha, 0, 0, 0));
//设置标题布局颜色
mLayoutTitle.setBackgroundColor(Color.argb((int) alpha, 255, 255, 255)); } }
}
/**
* Created by peiyan on 2017/8/9.
* 扩展自定义View,在Scrollview的基础上添加新的功能
* 1.类继承基础控件,实现三个复写方法;
* 2.自定义一个scrollview华东监听的接口
* 3.覆写scrollview自带的一个滑动监听
* 4.提供方法,让外界可以设置scrollview的监听对象
* 5.使用Myscrollview自定义控件
*
* 做自定义控件的思路:
* 1.看效果判断是那种类型的自定义控件
* 2.如果是继承式自定义控件,那么我们就要判断则个效果是基于那种基础控件之上
*
*/
public class MyScrollView extends ScrollView {
public MyScrollView(Context context) {
//super(context);
this(context,null);
}
public MyScrollView(Context context, AttributeSet attrs) {
//super(context, attrs);
this(context,attrs,0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//定义接口
public interface ScrollViewListensr{
//接口中的抽象方法
//scrollview自动滑动监听
//参数:1.监听view对象,2.3.新的坐标,4.5.旧的坐标
void onScrollChanged(MyScrollView myScrollView,int l, int t, int oldl, int oldt);
}
//自己的监听对象
private ScrollViewListensr mscrollViewListener;
//提供方法,让外界可以设置scrollview的监听对象
public void setScrollViewListener(ScrollViewListensr scrollViewListener){
mscrollViewListener=scrollViewListener;
}
//提供一个覆写的华东监听方法,让外界可以设置scrollview的监听对象
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if(mscrollViewListener!=null){
mscrollViewListener.onScrollChanged(this,l,t,oldl,oldt);
}
}
}