ListView के आधार पर एक कस्टम घटक बनाना

एंड्रॉइड एप्लिकेशन के लिए, मुझे एक डेटपिकर जैसा दिखने वाला एक इंटरफ़ेस तत्व चाहिए। वह सक्षम होना चाहिए:

आपको इस तरह का एक घटक मिलना चाहिए:


हम एक बच्चे की सूची दृश्य के साथ 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

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


All Articles