рдХрд╕реНрдЯрдо рд▓реЗрдЖрдЙрдЯред рднрд╛рдЧ 2. рд╕реЗрд▓рд▓реИрдЯрдЖрдЙрдЯ

рдлрд┐рд░ рд╕реЗ рдирдорд╕реНрдХрд╛рд░, рд╕рд╛рдерд┐рдпреЛрдВред

рдФрд░ рдлрд┐рд░ рд╕реЗ рдореИрдВ рдХрд╕реНрдЯрдо рд▓реЗрдЖрдЙрдЯ рдХреЗ рдПрдХ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдпрд╛ред рдЗрд╕ рдмрд╛рд░, рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ "рд╕реЗрд▓" рдорд╛рд░реНрдХрдЕрдк рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдЕрд░реНрде рд╕рд░рд▓ рд╣реИ: рдкреВрд░реЗ рдХрдВрдЯреЗрдирд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рд╣реА рдЖрдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдПрдХ рдЧреНрд░рд┐рдб рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рдВрд╢рдЬ рдЗрд╕ рдЧреНрд░рд┐рдб рдкрд░ рдордирдорд╛рдирд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдЖрдЙрдЯ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдмрдЯрди рдпрд╛ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдПрдХ рд╕реБрдВрджрд░ рдореЛрдЬрд╝реЗрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░, рдЪреВрдВрдХрд┐ рдпрд╣ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд┐рд▓рд╡рд╛рдпрд╛ рдЧрдпрд╛ рд▓реЗрдЖрдЙрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЪрд╛рд▓рд╛рдХреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред



рд╡рдВрд╢рдЬ рдЧреБрдг

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдкрдирд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░реЗрдВ - рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рдорд╛рдкрдирд╛ рдФрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдирд╛, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдЧреБрдг рд╣реЛрдВрдЧреЗред
рд╣рдорд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рдВрд╢ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реЛрдВрдЧреЗ:
  1. рдмрд╛рдПрдБ - рдмрд╛рдПрдБ рд╕реЗрд▓
  2. рд╢реАрд░реНрд╖ - рд╢реАрд░реНрд╖ рд╕реЗрд▓
  3. cellsWidth - рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛
  4. cellsHeight - рд▓рдВрдмрд╡рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛


рдЖрдЗрдП рдЗрди рдЧреБрдгреЛрдВ рдХреЛ xml рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

<resources> <declare-styleable name="CellLayout"> <attr name="columns" format="integer" /> <attr name="spacing" format="dimension" /> <attr name="layout_left" format="integer" /> <attr name="layout_top" format="integer" /> <attr name="layout_cellsWidth" format="integer" /> <attr name="layout_cellsHeight" format="integer" /> </declare-styleable> </resources> 


рд╣рдордиреЗ рдЕрдкрдиреЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЧреБрдгреЛрдВ рдХреЛ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ - рдХреЙрд▓рдо ( рдХреЙрд▓рдо ) рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реЗрд▓ ( рд╕реНрдкреЗрд╕рд┐рдВрдЧ ) рдХреЗ рдЕрдВрджрд░ рдЗрдВрдбреЗрдВрдЯреЗрд╢рдиред

рд▓реЗрдЖрдЙрдЯ рдкрд░рдо


рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реНрдпреВрдЧреНрд░реБрдк рдмрдирд╛рдПрдВ, рдЗрд╕реЗ рд╕реЗрд▓рд▓реИрдЯрдЖрдЙрдЯ рдХрд╣реЗрдВред
рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рд╣реИ рд╣рдорд╛рд░рд╛ рд▓реЗрдЖрдЙрдЯрдкрд╛рд░реНрдореНрд╕, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдг рд╣реЛрдВрдЧреЗ, рдФрд░ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред
рд▓реЗрдЖрдЙрдЯрдкрд╛рд░реНрдореНрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рдВрд╢рдЬ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рд╡рдВрд╢рдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдЧреИрд░-рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, RelativeLayout рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЖрдЙрдЯ_ * рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╡рдВрд╢ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд▓реЗрдЖрдЙрдЯ_рдЯреЛрд▓реЗрдлреНрдЯрдСрдл)ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрдЯреЗрдирд░ рдореВрд▓ рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓ рд╕реЗрдЯ ViewGroup.LayoutParams (layout_width, layout_height) рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдереЛрдбрд╝рд╛ рдЙрдиреНрдирдд рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ - рдорд╛рд░реНрдЬрд┐рдирд▓рдЖрдЙрдЯрдЖрдЙрдЯ, рдЬреЛ рдорд╛рд░реНрдЬрд┐рди рдЬреЛрдбрд╝рддрд╛ рд╣реИред

 public static class LayoutParams extends ViewGroup.LayoutParams { int top = 0; int left = 0; int width = 1; int height = 1; public LayoutParams(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout); left = a.getInt(R.styleable.CellLayout_layout_left, 0); top = a.getInt(R.styleable.CellLayout_layout_top, 0); height = a.getInt(R.styleable.CellLayout_layout_cellsHeight, -1); width = a.getInt(R.styleable.CellLayout_layout_cellsWidth, -1); a.recycle(); } public LayoutParams(ViewGroup.LayoutParams params) { super(params); if (params instanceof LayoutParams) { LayoutParams cellLayoutParams = (LayoutParams) params; left = cellLayoutParams.left; top = cellLayoutParams.top; height = cellLayoutParams.height; width = cellLayoutParams.width; } } public LayoutParams() { this(MATCH_PARENT, MATCH_PARENT); } public LayoutParams(int width, int height) { super(width, height); } } 


рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣рд╛рдБред ViewGroup.LayoutParams рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдЬреЛ рд╣рдорд╛рд░реЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ XML рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдЕрдм, рд╣рдо рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЗрд╕ рд╢реНрд░реЗрдгреА рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдиреЗ рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ ViewGroup рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:

 public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { return new CellLayout.LayoutParams(getContext(), attrs); } protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { return p instanceof CellLayout.LayoutParams; } protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { return new CellLayout.LayoutParams(p); } protected ViewGroup.LayoutParams generateDefaultLayoutParams() { return new LayoutParams(); } 


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВред

рдорд╛рдк


рдЕрдм рдЬрдм рд╣рдордиреЗ рд╡рдВрд╢рдЬ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рд╡рдВрд╢реЛрдВ рдореЗрдВ рдПрдХ рдЖрдпрд╛рдо рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо onMeasure рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдореИрдВ рдЖрдкрдХреЛ onMeasure рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмрддрд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдЧреЗ рдХреЛрдИ рд╕рд╡рд╛рд▓ рди рдЙрдареЗред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХреЗ рд╕рднреА рд╡рдВрд╢реЛрдВ рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
рдЙрдирдХреЗ рдкрд╛рд╕ рджреЛ рд╣реИрдВ:
  1. рд╣рдореЗрдВ setMeasuredDimension (рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП; рдЗрд╕рдореЗрдВ рд╡рд┐рдзрд┐, рдЬрд╣рд╛рдВ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рд╣рдорд╛рд░реЗ рдЖрдХрд╛рд░ рд╣реИрдВ
  2. рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдЙрд╕реЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

OnMeasure рдХреЗ рдЗрдирдкреБрдЯ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдБрдЪрд╛рдИ рдХреЗ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢, рдЪрд╛рд╣реЗ рд╡реЗ рдПрдорд┐рд╕ рд╣реЛрдВред рдпрд╣рд╛рдБ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИрдВ - рд╕рдВрдмрдВрдзрд┐рдд рдкрдХреНрд╖ рдХрд╛ рдЖрдХрд╛рд░, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХрд╛ "рдореЛрдб"ред рдмреЗрд╢рдХ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд▓реЗрдЖрдЙрдЯ_рдЖрд░реНрдбрд░ рдФрд░ рд▓реЗрдЖрдЙрдЯ_рд╣рд╛рдЗрдЯ рдХреЛ рдХреНрдпрд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдореЛрдб рддреАрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдорд╛рдкрддреЗ рд╕рдордп рдкреВрд░реНрд╡рдЬ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрдирдореЗрдВ рд╕реЗ рддреАрди рд╣реИрдВ:

рдорд╛рдк рдХреА рд░рдгрдиреАрддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛:

onLayout
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int width = 0; int height = 0; if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY) { width = MeasureSpec.getSize(widthMeasureSpec); cellSize = (float) (getMeasuredWidth() - getPaddingLeft() - getPaddingRight()) / (float) columns; } else { cellSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_CELL_SIZE, getResources() .getDisplayMetrics()); width = (int) (columns * cellSize); } int childCount = getChildCount(); View child; int maxRow = 0; for (int i = 0; i < childCount; i++) { child = getChildAt(i); LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); int top = layoutParams.top; int w = layoutParams.width; int h = layoutParams.height; int bottom = top + h; int childWidthSpec = MeasureSpec.makeMeasureSpec((int) (w * cellSize) - spacing * 2, MeasureSpec.EXACTLY); int childHeightSpec = MeasureSpec.makeMeasureSpec((int) (h * cellSize) - spacing * 2, MeasureSpec.EXACTLY); child.measure(childWidthSpec, childHeightSpec); if (bottom > maxRow) { maxRow = bottom; } } int measuredHeight = Math.round(maxRow * cellSize) + getPaddingTop() + getPaddingBottom(); if (heightMode == MeasureSpec.EXACTLY) { height = MeasureSpec.getSize(heightMeasureSpec); } else if (heightMode == MeasureSpec.AT_MOST) { int atMostHeight = MeasureSpec.getSize(heightMeasureSpec); height = Math.min(atMostHeight, measuredHeight); } else { height = measuredHeight; } setMeasuredDimension(width, height); } 



рдХрд┐рдпрд╛, рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдиреЗ рдЕрдм рд╣рдо рдЙрд╕рдореЗрдВ рдХреНрдпрд╛ рд░рдЦрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рд╡рдВрд╢рдЬ рдХрд╣рд╛рдВ рд╣реИрдВ? рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ: рд▓реЗрдЖрдЙрдЯред

рд╡реНрдпрд╡рд╕реНрдерд╛


рдЕрдЧрд▓рд╛ рдЪрд░рдг рд▓реЗрдЖрдЙрдЯ рд╣реИред рдпрд╣ рдЕрджреНрднреБрдд onLayout рдкрджреНрдзрддрд┐ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд▓ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рджреЗрддреЗ рд╣реИрдВред

 protected void onLayout(boolean changed, int l, int t, int r, int b) { int childCount = getChildCount(); View child; for (int i = 0; i < childCount; i++) { child = getChildAt(i); LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); int top = (int) (layoutParams.top * cellSize) + getPaddingTop() + spacing; int left = (int) (layoutParams.left * cellSize) + getPaddingLeft() + spacing; int right = (int) ((layoutParams.left + layoutParams.width) * cellSize) + getPaddingLeft() - spacing; int bottom = (int) ((layoutParams.top + layoutParams.height) * cellSize) + getPaddingTop() - spacing; child.layout(left, top, right, bottom); } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рдЕрдЪрд╛рдирдХ, рд╡рд╣ рд╕рдм рд╣реИ рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд▓реЗрдЖрдЙрдЯ рдорд┐рд▓рд╛ рдЬреЛ рд╣рдореЗрдВ рдЧреНрд░рд┐рдб рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

рд╢рд╛рдЦрд╛ рдХрд╛ рд▓реЗрдЖрдЙрдЯ
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:cl="http://schemas.android.com/apk/res/com.evilduck.celllayout" android:layout_width="match_parent" android:layout_height="wrap_content" tools:ignore="HardcodedText" > <com.evilduck.celllayout.CellLayout android:id="@+id/cell_layout" android:layout_width="match_parent" android:layout_height="wrap_content" cl:columns="4" cl:spacing="1dp" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="1" cl:layout_left="0" cl:layout_top="0" android:background="#00FF00" android:text="View 1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="3" cl:layout_left="1" cl:layout_top="0" android:background="#FFFF00" android:text="View 2" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="1" cl:layout_left="1" cl:layout_top="1" android:background="#FFFFFF" android:text="View 3" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="1" cl:layout_left="0" cl:layout_top="1" android:background="#00FFF0" android:text="View 4" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="2" cl:layout_left="2" cl:layout_top="1" android:background="#00FA00" android:text="View 5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="2" cl:layout_cellsWidth="3" cl:layout_left="0" cl:layout_top="2" android:background="#AAFFAA" android:text="View 5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="2" cl:layout_cellsWidth="1" cl:layout_left="3" cl:layout_top="2" android:background="#45CCdd" android:text="View 6" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="3" cl:layout_cellsWidth="1" cl:layout_left="0" cl:layout_top="4" android:background="#FF00FF" android:text="View 7" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="3" cl:layout_cellsWidth="1" cl:layout_left="1" cl:layout_top="4" android:background="#FFFF00" android:text="View 8" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="3" cl:layout_cellsWidth="1" cl:layout_left="2" cl:layout_top="4" android:background="#00FF00" android:text="View 9" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="1" cl:layout_left="3" cl:layout_top="4" android:background="#FFFF00" android:text="View 10" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="1" cl:layout_left="3" cl:layout_top="5" android:background="#FFFFFF" android:text="View 11" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" cl:layout_cellsHeight="1" cl:layout_cellsWidth="1" cl:layout_left="3" cl:layout_top="6" android:background="#555555" android:text="View 12" /> </com.evilduck.celllayout.CellLayout> </ScrollView> 



рдкрд░рд┐рдгрд╛рдо:



рд╣реБрд░реНрд░реЗ, рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рдереЗред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдирд╛ рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреА рдмрд╛рдЗрдХ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдПрдХ рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдкрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣реИ рдирд╛?
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореЗрд░реЗ рдЧреАрдердм рдкрд░ рд╕рднреА рд╕реНрд░реЛрдд рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдореИрдВрдиреЗ рдпрд╣ рднреА рдХрд╣рд╛, рд╕рд┐рд░реНрдл рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП, рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рдорд┐рд╢реНрд░рдгред рдореВрдб рдЕрдЪреНрдЫрд╛ рдерд╛ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

EDIT : рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдкрд╛рдардХ рдиреЗ рдореБрдЭрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдФрд░ рдХрд╣рд╛ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рд▓рд╛рдВрдЪрд░ рдПрдХ рд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдорд╛рди рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рд╢рд╛рдпрдж рдХреЛрдИ рдХрд╛рдо рдЖрдПрдЧрд╛ред
https://github.com/chrislacy/LauncherJellyBean/blob/master/src/com/launcherjelly/android/CellLayout.java ред

Source: https://habr.com/ru/post/In191842/


All Articles