1. 程式人生 > >通過ScrollView實現滾動效果

通過ScrollView實現滾動效果

此文,僅做為個人學習Android,記錄成長以及方便複習!

通過ScrollView添加了滾動條,解決內容過長顯示不全,通過滾動顯示檢視!

首先是用ScrollView把需要滾動顯示的內容包裹起來

ScrollView 垂直滾動 HorizontalScrollView 水平滾動

android:scrollbars="none"去除滾動條顯示

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/scorl"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:scrollbars="none"
        android:layout_below="@id/up">
        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/tv1"/>
    </ScrollView>
    <Button
        android:id="@+id/up"
        android:onClick="onclick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="前進"/>

    <Button
        android:id="@+id/down"
        android:onClick="onclick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/up"
        android:layout_toRightOf="@+id/up"
        android:text="後退" />
</RelativeLayout>

文字比較長,所有放在是string.xml資料夾,其實開發起來正常文字都是得放到string.xml的

<resources>
    <string name="app_name">ScrolView</string>
    <string name="tv1">第二部
在外修行兩年的鳴人回來了。但此時的“曉”也開始蠢蠢欲動,已經成為砂隱村風影的我愛羅被“曉”成員迪達拉和蠍抓走。鳴人和卡卡西小組為了救出我愛羅而前往砂隱村,並找出了“曉”的根據地,但我愛羅已經被抽離尾獸而死亡。憤怒的鳴人不顧一切地追趕迪達拉,而小櫻和砂忍者村的千代婆婆聯手與蠍交戰,最終將蠍打倒。千代婆婆犧牲自己的生命,使用轉生忍術將我愛羅復活,鳴人他們回到木葉隱村。
卡卡西由於勞累過度而住院,暗部的大和代替卡卡西帶領第七班,新的成員佐井也加入了隊伍。他們利用從蠍那裡得到的情報,前往天地橋打聽有關佐助的訊息。但佐井實際上卻是奉上司團藏的命令執行暗殺佐助的極祕任務,本打算執行任務的他在看到鳴人與佐助的羈絆之後改變了想法。鳴人等人終於在大蛇丸的根據地與佐助重逢,但佐助仍然不打算回心轉意,還是選擇和大蛇丸一起離開。而佐井則因為這一任務的契機成為了鳴人他們的同伴。
鳴人為了學會比螺旋丸更強的術而展開修行,此時“曉”的成員飛段和角都為了捕獲九尾而入侵木葉,與第十班的成員交戰,阿斯瑪在這一戰中中了飛段的咒術而犧牲。為了替阿斯瑪報仇,鹿丸等人結成新的小隊,與卡卡西一道向飛段和角都挑戰。鹿丸運用過人的智慧打敗了強敵飛段,而鳴人也終於學成了新術“風遁·螺旋手裡劍”,來到戰場支援,一擊打倒了角都,贏得勝利。
此時佐助認為自己已經獲得了超越大蛇丸的力量而突然向大蛇丸攻擊,破解了他的轉生忍術,打倒了大蛇丸。佐助找到了大蛇丸原先的部下水月、香燐和重吾,四人組成名為“蛇”的小隊,為了尋找鼬而展開行動。在此期間,佐助與“曉”的迪達拉遭遇並交戰,迪達拉敗於佐助手下,為了證明自己的藝術而自爆,佐助卻躲在了萬蛇的體內而躲過一劫。迪達拉的隊友、戴著面具的“曉”的新成員“阿飛”本以為也死於爆炸之中,但“阿飛”卻突然在“曉”的首領佩恩面前出現,並自稱為“宇智波斑”,以幕後黑手的姿態現身。
自來也為了獲取“曉”的情報而潛入雨隱村,在那裡遇到佩恩和小南,並認出佩恩就是自己昔日的徒弟長門。雖然自來也啟動仙人模式與佩恩六道交戰,但還是不敵輪迴眼的力量。自來也為了得到敵人的情報而犧牲,臨終前讓深作仙人將情報帶回木葉。
佐助終於找到了鼬,和鼬展開激烈的戰鬥,兩人各自施展自己的絕技發動攻擊。佐助由於查克拉耗盡而導致隱藏在體內的大蛇丸重新現身,但鼬卻利用須佐能乎手裡的十拳劍封印了大蛇丸。不過鼬由於身患重病,在激烈的戰鬥過後就倒地身亡。佐助也因力量耗盡而倒下,被“阿飛”帶走,“阿飛”告訴了他關於鼬的真相。佐助得知了鼬想要保護自己和村子的心意,而決定毀滅木葉隱村。佐助將“蛇”小隊改名為“鷹”,為了得到“曉”的幫助而答應他們前往雲隱村捕獲八尾。
鳴人得知自來也犧牲的訊息而大為悲痛,為了替自來也報仇而決定前去妙木山修煉仙術。此時佩恩六道突然對木葉隱村發動攻擊,並幾乎將村子毀滅了,連卡卡西也在和天道的交戰中犧牲。學會仙術的鳴人回到村子,接連打敗了六道中的五人,在與天道交戰中由於目睹雛田為保護自己而重傷,導致體內的九尾暴走,此時鳴人的父親第四代火影突然出現在鳴人的精神世界中,阻止了九尾。鳴人由於父親的幫助而重新回到戰場,打倒了佩恩天道。鳴人找到了佩恩的本體長門所在的位置,說服長門重新找回昔日的理想,長門施展輪迴天生之術讓包括卡卡西在內的已經犧牲的木葉村的忍者復活,自己也因此而死去。鳴人由於保護了村子而成為英雄,得到村人的認可。
    </string>
</resources>

然後就是Activiry了

其中重點的是:

scroll.getChildAt(0).getMeasuredHeight():總高度
scroll.getHeight():螢幕高度
scroll.getScrollY():滑動條滑動距離
總高度<=螢幕高度+滑動距離,則到底了
// 1.scrollTo:以滾動檢視起始位置開始計算的。
// 2.scrollBy:相對前一次位置滾動相應的距離。
package com.rui.scrolview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
    //宣告元件
    private ScrollView scrollView;
    private TextView tv1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //例項化ScrollView和TextView
        scrollView = (ScrollView)findViewById(R.id.scorl);
        tv1 = (TextView)findViewById(R.id.tv1);
        //ScrollView 新增監聽事件
        scrollView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                //判斷手勢
                switch(motionEvent.getAction()){
                    //滑動
                    case MotionEvent.ACTION_MOVE :
                        //當前滑動<=0提示在頂部
                        if(scrollView.getScrollY()<=0){
                            Toast.makeText(MainActivity.this,"頂部了,別劃了!",Toast.LENGTH_SHORT).show();
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                        }
                        ///scroll.getChildAt(0).getMeasuredHeight():總高度
                        //scroll.getHeight():螢幕高度
                        //scroll.getScrollY():滑動條滑動距離
                        //總高度<=螢幕高度+滑動距離,則到底了
                        if(scrollView.getChildAt(0).getMeasuredHeight()<=scrollView.getHeight()+scrollView.getScrollY()){
                            Toast.makeText(MainActivity.this,"到底了,重新載入..",Toast.LENGTH_SHORT).show();
                            //判讀底部之後,重新追加文字
                            tv1.append(getResources().getString(R.string.tv1));
                        }
                        break;
                }
                return false;
            }
        });
    }
    //按鈕的監聽方法
    public void onclick(View view){
        switch(view.getId()){
            case R.id.up:
                // 1.scrollTo:以滾動檢視起始位置開始計算的。
                // 2.scrollBy:相對前一次位置滾動相應的距離。
                scrollView.scrollBy(0,+30);
                break;
            case R.id.down:
                scrollView.scrollBy(0,-30);
                break;
        }
    }
}