您當前位置>首頁 » 新聞資訊 » 技(jì)術(shù)分(fēn)享 >
自(zì)定義橫向的(de)ScrollView
發表時(shí)間(jiān):2021-1-10
發布人(rén):葵宇科(kē)技(jì)
浏覽次數(shù):52
介紹一(yī)個(gè)自(zì)定義橫向的(de)Scroll♦✔ View,可(kě)以監聽(tīng)滑動的(de)狀态,可(k↓¥≥ě)以監聽(tīng)滑動到(dào)了(le)最左側,正在中間(ji ✘∏✘ān)滑動和(hé)滑到(dào)了(le)最右邊。
思路(lù):
1.根據ScrollView中第一(yī)層的(de)子(zǐε↓✔)View,其實第一(yī)層也(yě)就(jiù)一(yī)≠ 個(gè)View,這(zhè)是(shì)Scrol &lView規定的(de),ScrollView包含的(de)內(nèi)容,必須全部<≤放(fàng)到(dào)一(yī)個(gè)子(zǐ)Vε♣☆iew中。
2.根據最第一(yī)個(gè)子(zǐ)View的(de)左側坐(z•∏★uò)标,右側坐(zuò)标,ScrollView的(de)寬度和(hé)橫向滑動的(de)距→®♥₩離(lí),來(lái)判斷滑動的(de)位置。
3.定義滑動位置的(de)監聽(tīng)接口。
public class MyScrollView extends Horizoδ↓γ>ntalScrollView { public MyScrollView™≤↕(Context context) { super(contex↑'t); } public MyScrollView(Context context♥∏, AttributeSet attrs) { super(cont♥≠ext, attrs); } public M∏€™yScrollView(Context context, AttributeS<et attrs, int defStyle) { super(context, att↑γ₹rs, defStyle); } @Override protected void ★±onScrollChanged(int l, int t, i✘≠ nt oldl, int oldt) { View view = (View) ΩΩgetChildAt(getChildCount() - 1); // 如(rú)果為σ ←↓(wèi)0,證明(míng)滑動到(dào)最左邊 if (&¶β£view.getLeft() - getScrollX() == 0) { onScr≠₽ollListener.onLeft(); // 如(rú)果為(w&€₹×èi)0證明(míng)滑動到(dào)最右邊 } else if ((view.getRi&Ω₽∏ght() - (getWidth() + getScrollX())) == ✘'0) { onScrollListener.onRight(); // 說<×(shuō)明(míng)在中間(jiān) } else { onSc♦±ασrollListener.onScroll(); } super.onScrollC'£hanged(l, t, oldl, oldt); } /** * 'εσ定義接口 * * @author admin *≠₹>/ public interface OnScrollLδ istener1 { void onRight(); void onLeft↑(); void onScroll(); } private OnSc§αrollListener1 onScrollListener; puσ§<★blic void setOnScrollListener(OnScrollList'≠♠ener1 onScrollListener) { this.onSc ≤→'rollListener = onScrollListener; } }首先獲取ScrollView的(de)第一(yī)個(gè)孩子(zǐ),★♦獲取到(dào)左側的(de)坐(zuò)标view.getLef♥δβt(),獲取ScrollView在X方向滑動的(de)距離(lí):getScr←∞ollX(),就(jiù)是(shì)ScrollView和(hé)左側邊緣的(de)距離(lí)φ♠。獲取第一(yī)個(gè)孩子(zǐ)最右側X的(de↔ →π)坐(zuò)标:view.getRight().ScrllView的(de)寬度:ge↔ ₹tWidth()
view.getLeft()和(hé)view.getLeft()的(de)值是 σ(shì)不(bù)變的(de)。
view.getLeft():ScrollView的(de)寬度,其實也(yě)是(shì)屏÷↓¥¶幕的(de)寬度。
[img]http://img.blog.csdn.net/±≠20150108111043953?watermark/2/text/aHR0cDovL2Jsb&₩2cuY3Nkbi5uZXQvZm9yd2FyZHl6aw==/font/5a6L←®±5L2T/fontsize/400/fill/I0JBQk↑ FCMA==/dissolve/70/gravity/Center
使用(yòng)步驟:
activity_main.xml
<LinearLayout xmlns:and₽βroid="http://schemas.android.com/ap>÷k/res/android" android:layou≤♣±t_width="fill_parent" android≠β:layout_height="fill_parent£ £" android:orientation="vertica ≠l" > <LinearLayout &§× android:id="@+id/linearLayout1" >' android:layout_width="ma♣λ☆"tch_parent" android:layout_height=↕↕σ"wrap_content" andro☆β♦♠id:background="#fef4dc" and→≠₹σroid:gravity="center" ÷× android:orientation=&q±αuot;horizontal" > ≈♠< <com.example.view.MyScro✘llView android:id="@+idλπ☆/myView" anβ★droid:layout_width="ma××tch_parent" android:layout§∞ε×_height="match_parent" ∏♥δ android:scrollbars=&quo♦α∏t;none" > <Li≤γ✘nearLayout android:id="@←'+id/sortliner" ¥§ android:layout_width="match_↑♣εparent" android:layout_heighΩασ↕t="match_parent" π android:gra↕ <€vity="center" ☆βφandroid:orientation="hor♣↕izontal" ≠×✔ android:paddingLeft="10dp&quo§↑t; androidβδγφ:paddingRight="10dp" > ≥ ≥ </LinearLayout> </c$πom.example.view.MyScrollView> </Liα ☆σnearLayout> </LinearLayout>
MainActivity.java
public class MainActivity €∑∞₽extends Activity { private final ↔> String TAG = MainActivity.class.getSimpl★©>♣eName(); final String[] arr = { "骨₽₽₹€科(kē)", "婦科(kē)"©→₽;, "普外(wài)科(kē)", "神經內(nèi)科(kē "σδ)", "神經科(kē)", "神經外(wài)科(kē)©€®", "普外(wài)", "普內(nèi)&q←↓φuot;, "呼吸科(kē)", &♠♣quot;消化(huà)科(kē)", "兒(ér)科(kē♥ )", "心內(nèi)" }; private MyScr∏£♦ollView myView;// 自(zì)定義的(de)滑動vie$β≤δw private LinearLayout sortliner;¶ε©☆// 滑動條 @Override protected void onCr↑≈&πeate(Bundle savedInstanceState) { super.onC≈"±¶reate(savedInstanceState); setContentViαγ<•ew(R.layout.activity_main); ini↑≤tView(); int screenWidth = getWindowManaπ¶'ger().getDefaultDisplay().getWidth(); Toast✔♣.makeText(getApplicationContext(), &<>¥quot;"+screenWidth, 0).show(); } ↕ε→≈ public void initView() { myVie¶"γw = (MyScrollView) findView♣♥×ById(R.id.myView); sortliner = (LinearLayout) " findViewById(R.id.sortliner); Ωβ♣± sortliner.removeAllViews(); myView.se♦tOnScrollListener(new OnScrollListener1()×₩€€ { @Override public void onScroll(&<£) { Log.d(TAG, "在中間(jiān)滑動"); ©¥λ} @Override public void onRight() { ♥♦♠δ Log.d(TAG, "滑動到(dào)了(le)最右邊"); ™♦ Toast.makeText(getApplicaπ ✔ tionContext(), "滑到(dào)了(le)最右邊&±♦← quot;, 0).show(); } @Override pπ≤ublic void onLeft() { "δ₹Log.d(TAG, "滑動到(dào)了(le)β§&£最左邊"); Toast.makeText(getApplicationCo±€$ntext(), "滑到(dào)了(le)最左邊", 0).sσ§§how(); } }); initScrollChildV↔£•≥iew(); } /** * 準備向Scroller中•₽添加View * * @param params */ p®φ☆ rivate void initScrollChildView() { L≠¶'ayoutParams params = new LayoutParams≥ •(LayoutParams.MATCH_PARENT, LayoutParams.WR€™AP_CONTENT); for (int i = 0; i < arr.length✘δΩ; i++) {// 往二級分(fēn)類中加載數(shù)據 <♦ Button sort = new Button(Maσσ♣inActivity.this); sort.setText(a€±₽'rr[i]); sort.setTextSize(¥♦"♠15); sort.setMinHeight(30); ™& sort.setPadding(20, 5, 20, 5); // 把T♦"≠<extView添加到(dào)滑動條內(nèi) ♦↑¶ sortliner.addView(sort, i, params); $γ} } }
源碼下(xià)載地(dì)址:http://download.csdn.ne±φt/detail/forwardyzk/8339959
效果圖:
[img]http://img.blog.csdn.net/20♥®150108113330250?watermark/2/text/aHR0cDovL2Jsb2★&♠★cuY3Nkbi5uZXQvZm9yd2FyZHl6aw==/font/5a6L5L2T/font×σεsize/400/fill/I0JBQkFCMA==/dissolve/7δ♥×0/gravity/Center