您當前位置>首頁 » 新聞資訊 » 技(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








