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

рд╣рдо рдПрдХ рдмрдЪреНрдЪреЗ рдХреА рд╕реВрдЪреА рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде LinearLayout рд╕реЗ рд╣рдорд╛рд░реЗ RollView рдШрдЯрдХ рдХрд╛ рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВрдЧреЗред рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░, рд╣рдо рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╕рдордп ListView рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП OnScrollListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
public class RollView extends LinearLayout implements OnScrollListener{ private final ListView innerListView; }
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╕реВрдЪреА рджреГрд╢реНрдп рдХреЛ xml рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд░рдВрдн рдХрд░реЗрдВ рдФрд░ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред
рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдУрд╡рд░рд░рд╛рдЗрдб getView () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдВрддрд░рд┐рдХ рдПрдбреЗрдкреНрдЯрд░ рдмрдирд╛рдПрдВ:
private class RollAdapter extends ArrayAdapter<String> { private final LayoutInflater mInflater; @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null){ convertView = mInflater.inflate(R.layout.roll_view_adapter, null); convertView.setLayoutParams(mParams); } TextView tv = (TextView) convertView.findViewById(R.id.text); tv.setTag(position); // tv.setText(getItem(position)); convertView.setTag(tv); // TextView if (!listViews.contains(convertView)) listViews.add(convertView); // return convertView; } }
GetView рдкрджреНрдзрддрд┐ рд╕реЗ рд╕рднреА рджреГрд╢реНрдп ArrayList рдХреЛ рдЙрдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд░рд┐рдлреНрд░реЗрд╢ рд▓рд╛рдЗрдЙрдЯрдкреНрд░реЗрдо () рд╡рд┐рдзрд┐ рд╕реВрдЪреА рдЖрдЗрдЯрдореЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред рд╣рдордиреЗ рдПрдбреЙрдкреНрдЯрд░ рд╡рд░реНрдЧ рдореЗрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рдмреАрдЪ рдореЗрдВ рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░рдгреА рдХреЗ рдЖрд░рдВрдн рдФрд░ рдЕрдВрдд рдореЗрдВ рдЦрд╛рд▓реА рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдЕрдм рдЖрдкрдХреЛ onScroll рдФрд░ onScrollStateChanged рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
private int lastFirstVisibleElement; // " " private int centralIndex; // @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { refreshTextViews(); // // if (lastFirstVisibleElement > firstVisibleItem){ Log.i("RollView", "Scroll up"); } else if (lastFirstVisibleElement < firstVisibleItem){ Log.i("RollView", "Scroll down"); } lastFirstVisibleElement = firstVisibleItem; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // if (scrollState == SCROLL_STATE_IDLE){ // smoothScrollToPositionFromTop(centralIndex - totalElementVisible / 2 , 0, 1); }
рд░рд┐рдлреНрд░реЗрд╢рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ () рд╡рд┐рдзрд┐ рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╛рда рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдФрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
public void refreshTextViews(){ float maxTextSize = 0; for (View v : listViews){ int centerOfViewY = v.getBottom() - (mAdapter.mParams.height / 2); ShadowTextView tv = (ShadowTextView) v.getTag(); float coefficient = (Math.abs(centerOfViewY - mAdapter.centerLineY)) / (float)mAdapter.centerLineY; float scale = 0; // 1 - if (coefficient < 1) scale = Math.abs(coefficient - 1); tv.setAlpha(scale); // float textSize = CENTRAL_TEXT_SIZE * scale; if (textSize > maxTextSize){ maxTextSize = textSize; centralIndex = (Integer) tv.getTag(); } tv.setTextSize(textSize); } }
рдпрд╣ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TextView рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╢реИрдбреЛ рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдШрдЯрдХ рдмрдирд╛рдПрдВред рдЫрд╛рдпрд╛ рдХреЗ рд╕рд╛рде рдкрд╛рда рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдмреНрд░рд╢ (рдкреЗрдВрдЯ) рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдмреНрд░рд╢ рд╡рд┐рдХрд▓реНрдк
рдирд┐рдЬреА рдЕрдВрддрд┐рдо рдкреЗрдВрдЯ mPaint = рдирдпрд╛ рдкреЗрдВрдЯ ();
// private void initPaint(){ mPaint.setAntiAlias(true); mPaint.setTextSize(getTextSize()); mPaint.setColor(Color.WHITE); mPaint.setStrokeWidth(2.0f); mPaint.setStyle(Paint.Style.FILL); mPaint.setTextAlign(Paint.Align.CENTER); mPaint.setShadowLayer(10.0f, 0.0f, 0.0f, Color.BLACK); }
рдФрд░ onDraw () рд╡рд┐рдзрд┐ рдореЗрдВ, рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдБ:
private final Rect mBounds = new Rect(); // @Override protected void onDraw(Canvas canvas){ canvas.drawColor(Color.TRANSPARENT); int x = getWidth() / 2; int y = (getHeight() + mBounds.height()) / 2; canvas.drawText(getText().toString(), x, y, mPaint); } }
RollView рд╕реЗ рдЫрд╛рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, redraw () рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
public void redraw(){ text = getText().toString(); mPaint.setTextSize(getTextSize()); mPaint.getTextBounds(text, 0, getText().toString().length() , mBounds); invalidate(); }
рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ TextView рдХреЛ рд╢реИрдбреЛрдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдФрд░ рд░рд┐рдлреНрд░реЗрд╢рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдкрджреНрдзрддрд┐ рдореЗрдВ tv.redraw () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ;
рдЕрдм, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ getCurrentItemValue () рдФрд░ getCurrentItemIndex () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХрд╛ рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рди:
рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:
https://bitbucket.org/msinchevskaya/rollview