×Ô¶¨ÒåViewÄÇЩÊÂ
ǰÑÔ
AndroidϵͳÒѾΪÎÒÃÇÌṩÁËÓи÷ÖÖ¹¦ÄܵÄViewÁË£¬ÈçÏÔʾÎı¾µÄ£¬Í¼Æ¬µÄ£¬»¹ÌṩÁËһЩViewGroup¿ØÖÆ×ÓViewÏÔʾµÄ£¬ÈçListView£¬LinearLayout£¬RelativeLayout£¬È»¶øÄØ£¬Ãæ¶Ô¸´ÔÓ¶à±äµÄ²úÆ·ÐèÇó£¬ÕâЩ»¹ÊÇÎÞ·¨Âú×ã¡£ÔÚºÚÂíµÄ¿Î³ÌÖУ¬ÎÒÃÇÓÐ4ÌìµÄרÃŽ²½â×Ô¶¨ÒåView֪ʶµÄ¿Î³Ì£¬Ò²ÔÚ4¸öÏîÄ¿ÖÐÈ¥´©²åµÄ½²½â×Ô¶¨Òå¿Ø¼þ£¬¿ÉÒÔ˵ËãÊDZȽÏÈ«ÃæÁË¡£½ñÌìÎÒ´Ó¼¸¸ö·½Ãæ×ۺϽ²½âÏÂÈçºÎÈ¥×Ô¶¨Òå³öÄãÏëÒªµÄView¡£
·ÖÎö
µ±ÎÒÃÇ˵Ҫ×Ô¶¨ÒåÒ»¸öViewʱ£¬ÆäʵÄãÊÇÔÚÏë×Ô¶¨ÒåÕâ¸öViewµÄÕâЩ·½Ã棺
1. ÄãÏë×Ô¶¨ÒåÕâ¸öViewÉÏÏÔʾµÄÄÚÈÝ
2. ÄãÏë×Ô¶¨ÒåÕâ¸öViewÖÐ×ÓViewµÄ°Ú·ÅλÖÃ
3. ÄãÏëÈÃÕâ¸öView¸úËæÊÖÖ¸µÄÒÆ¶¯½øÐÐijЩ±ä»¯
ËùÒÔ£¬ÎÒÃǾʹÓÕâ4¸ö·½ÃæÀ´Ñ§Ï°ÈçºÎ×Ô¶¨ÒåЧ¹û¡£
ʵ¼ù
ÈçºÎ×Ô¶¨ÒåViewÏÔʾµÄÄÚÈÝ
Ê×ÏÈ£¬ÄãÒªÖªµÀÏë×Ô¶¨ÒåViewÓ¦¸ÃÈ¥¼Ì³Ð×ÔË£¬µ½µ×ÊÇView»¹ÊÇViewGroup£»Èç¹ûÄãÖ»ÊÇÏë×Ô¶¨Òåµ¥¸öViewµÄÄÚÈÝ£¬ÄÇôӦ¸Ã¼Ì³Ð×ÔView£»Èç¹ûÄãÏë×Ô¶¨ÒåÒ»¸ö²¼¾ÖµÄÏÔʾÄÚÈÝ£¬ÄÇôӦ¸Ã¼Ì³ÐViewGroup¡£
ÏÖÔÚÎÒÃÇÉ趨ÐèÇó£¬Òª×öÒ»¸öÏÔʾһ¸öºìɫԲÐεÄView£¬ÄÇôÄãÒª¼Ì³ÐView£¬ÖØÐ´onDraw·½·¨£¬ÒòΪonDraw·½·¨¾ÍÊÇÔÊÐí×Ô¶¨ÒåÏÔʾÄÚÈݵķ½·¨¡£ÎÒÃÇÔÚÀïÃæ»æÖÆÒ»¸öÔ²£¬´úÂëÈçÏ£º
public class CircleView
extends View{
Paint paint =
new Paint();
public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setColor(Color.
RED);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(getWidth()/2, getHeight()/2, 50, paint);
}
}
Ч¹ûͼÈçÏ£º
ÏÂÃæÄØ£¬ÎÒÃÇÔÚÉèÒ»¸ö¸´ÔÓµãµÄÐèÇó£¬ÒªÇó×Ô¶¨ÒåÒ»¸öÏÔʾһ¸öºìÉ«¶Ô¹´µÄView£¬ÕâʱºòÒª»æÖƶԹ´£¬ÐèÒª½èÖúPathÀàÀ´¹´ÀÕ¡£´úÂëÈçÏ£º
public class TickView extends View{
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Path path = new Path();
public TickView(Context context, AttributeSet attrs) {
super(context, attrs);
paint.setColor(Color.RED);
paint.setStrokeWidth(8);
paint.setStyle(Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
path.moveTo(100, 100);
path.lineTo(140, 140);
path.lineTo(220, 60);
canvas.drawPath(path, paint);
}
}
Ч¹ûͼÈçÏ£º
Ok£¬ÒÔÉÏÕâЩ¾ÍÊÇÈçºÎ×Ô¶¨ÒåViewÄÚÈݵļ¼ÇÉ£¬µ±È»Èç¹ûÄãÏë»æÖÆ¸ü¼Ó¸´ÔÓµÄЧ¹û£¬ÄǾÍÒª×ÐϸѧϰһÏÂCanvasºÍPathµÄapiÁË¡£
ÈçºÎ×Ô¶¨ÒåViewÖÐ×ÓViewµÄλÖÃ
´Ë´¦ÓÉÓÚÄãÒª×Ô¶¨ÒåµÄViewÖÐÊǰüº¬×ÓViewµÄ£¬ÄÇôÄãÓ¦¸Ã¼Ì³ÐViewGroup£¬²¢ÇÒͨ³£Çé¿öÏ£¬ÎÒÃÇΪÁËʡȥʵÏÖonMeasure·½·¨£¬ÄÇô¾Í¿ÉÒԼ̳ÐϵͳÌṩµÄij¸ö²¼¾Ö£¬ÈçFrameLayout¡£×Ô¶¨Òå×ÓViewµÄλÖã¬ÄÇôÐèÒªÖØÐ´onLayout·½·¨ÁË£¬¸Ã·½·¨ÊÇÔÊÐíÄãËæÒâÖ¸¶¨×ÓViewλÖõġ£
ÏÖÔÚÎÒÃÇÉ趨ÐèÇó£¬ÒªÇóʵÏÖÒ»¸öViewGroup£¬ËüµÄ×ÓViewÊÇ´ÓÓÒÍù×ó±ßÅÅÁеġ£´úÂëÈçÏ£º
public class RightLayout extends FrameLayout{
public RightLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
View child1 = getChildAt(0);
View child2 = getChildAt(1);
child1.layout(getMeasuredWidth()-child1.getMeasuredWidth(),
getPaddingTop(),getMeasuredWidth(),
getPaddingTop()+child1.getMeasuredHeight());
child2.layout(child1.getLeft()-child2.getMeasuredWidth(), getPaddingTop(),getMeasuredWidth()-child1.getMeasuredWidth(),
getPaddingTop()+child2.getMeasuredHeight());
}
}
Ч¹ûͼÈçÏ£º
×ܽᣬͨ¹ýlayoutµÄ·½·¨À´¿ØÖÆViewµÄλÖã¬Õâ¸öÊôÓڱȽϼòµ¥µÄ¡£
ÈçºÎÈÃViewËæÊÖÖ¸ÒÆ¶¯½øÐб仯
ҪʵÏÖÕâ¸ö£¬ÄÇôÄãÐèÒªÍê³É2¸öµã£º
1. ¼àÌýÊÖÖ¸ÒÆ¶¯µÄ¾àÀë
2. ÈÃView½øÐÐһЩ±ä»¯
¶ÔÓÚµÚÒ»µã£¬¼àÌýÊÖÖ¸ÒÆ¶¯µÄ¾àÀ룬Õâ¸öºÜ¼òµ¥£¬¿ÉÒÔÖØÐ´onTouch·½·¨£¬»ñÈ¡ÊÖÖ¸ÒÆ¶¯¾àÀ룬Ҳ¿ÉÒÔ½èÖúViewDragHelperËù·â×°µÄ·½·¨À´¼àÌýÊÖÖ¸µÄÒÆ¶¯¡£¶ÔÓÚͨ¹ýonTouch·½·¨À´»ñÈ¡ÊÖÖ¸ÒÆ¶¯¾àÀëµÄ´úÂëÂÔ¹ý£¬ÏÂÃæÕ¹Ê¾Ò»ÏÂͨ¹ýViewDragHelperÀ´»ñÈ¡ÊÖÖ¸¾àÀëµÄ´úÂ룬ÄãÐèÒªÊìϤһÏÂViewDragHelperµÄÓ÷¨²ÅÄÜ¿´¶®ÏÂÃæµÄ´úÂ룬clampViewPositionHorizontal·½·¨µÄdx²ÎÊý¾ÍÊÇÊÖÖ¸ÒÆ¶¯µÄ¾àÀ룬´úÂëÈçÏ£º
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
//dx¾ÍÊÇÊÖÖ¸ÒÆ¶¯µÄ¾àÀë
return super.clampViewPositionHorizontal(child, left, dx);
}
ËùÒÔ£¬»ñÈ¡ÊÖÖ¸ÒÆ¶¯¾àÀëºÜ¼òµ¥£¬ÎÒÃÇÖ÷Òª°Ñ¾«Á¦·ÅÔÚÈÃView½øÐÐһЩ±ä»¯ÉÏ¡£
ÕâЩ±ä»¯Ò»°ãÊǵÄÊÇËõ·Å£¬Æ½ÒÆ£¬Í¸Ã÷£¬ÐýתµÄ±ä»¯£¬ÕâЩ±ä»¯Android¶¼ÎªÎÒÃÇÌṩÁ˶ÔÓ¦µÄ²Ù×÷ViewÊôÐԵķ½·¨£¬´úÂëÈçÏ£º
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
//dx¾ÍÊÇÊÖÖ¸ÒÆ¶¯µÄ¾àÀë
//Æ½ÒÆ
view.setTranslationX(dx);
//Ëõ·Å
view.setScaleX(0.1f);
view.setScaleY(0.1f);
//͸Ã÷
view.setAlpha(0.1f);
//Ðýת
view.setRotation(180);
return super.clampViewPositionHorizontal(child, left, dx);
}
µ±È»Èç¹ûÄãÐèÒªÈÃViewÖ´ÐÐijЩ¶¯»Ð§¹û£¬ÄÇôÄãÒª½èÖúÊôÐÔ¶¯»ÁË£¬Èç¹ûÄãÏë×Ô¶¨Ò嶯»Ð§¹û£¬ÄÇô¾ÍÐèҪʹÓÃValueAnimator£¬»òÕ߼̳ÐAnimatonÀàʵÏÖ×Ô¶¨Ò嶯»¡£
×ܽá
ÒÔÉÏ×ܽáÁËÎÒÃÇ×Ô¶¨ÒåViewÖÐ×î³£ÓõÄÇé¾°£¬µ±È»»¹ÓÐÆäËûºÜ¶àÇé¿ö¡£²»¹ýÎÒÃÇ¿ÉÒÔÔÚÕâ3ÖÖ»ù´¡ÉϾÙÒ»·´Èý¡£Óöµ½¸´ÔÓµÄЧ¹û£¬¾Í·ÖÀëÄ£¿é£¬Ò»µãÒ»µãʵÏÖ£¬×Ô¶¨ÒåViewÒ²¾ÍÄÇôµãÊ¡£
±¾ÎİæÈ¨¹éÀÖÓã²¥¿ÍAndroidÅàѵ
ѧԺËùÓУ¬»¶Ó×ªÔØ£¬×ªÔØÇë×¢Ã÷×÷Õß³ö´¦¡£Ð»Ð»£¡
×÷ÕߣºÀÖÓã²¥¿ÍAndroidÅàѵѧԺ
Ê×·¢£ºhttp://www.itcast.cn/Android