1. 程式人生 > >繼承式自定義控制元件——滑動ScrollView,標題顏色漸變

繼承式自定義控制元件——滑動ScrollView,標題顏色漸變

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private ImageView mIvDetail;
    private ObservableScrollView mScrollView;
    private TextView mTvTitlebar;
    private RelativeLayout mLayoutTitle;
    int height;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mIvDetail = (ImageView) findViewById(R.id.iv_detail);
        mScrollView = (ObservableScrollView) findViewById(R.id.scrollView);
        mTvTitlebar = (TextView) findViewById(R.id.tv_titlebar);
        mLayoutTitle = (RelativeLayout) findViewById(R.id.layout_title);
        
        getHeight();
        mScrollView.setSVListener(new ObservableScrollView.SVListener() {
            @Override
            public void OnScrollChanger(ObservableScrollView scrollView, int l, int t, int oldl, int oldt) {

                if (t<=0){
                    mTvTitlebar.setVisibility(View.GONE);
                    mLayoutTitle.setBackgroundColor(Color.argb(0,0,0,0));
                }else if (t>0 && t<height){
                    mTvTitlebar.setVisibility(View.VISIBLE);
                    float scale=(float)t/height;
                    float alpha=255*scale;
                    mTvTitlebar.setText("ffffffffffffff");
                    mTvTitlebar.setTextColor(Color.argb((int) alpha,0,0,0));

                    mLayoutTitle.setBackgroundColor(Color.argb((int) alpha,255,255,255));
                }
            }
        });
    }

    public void getHeight() {
        ViewTreeObserver observer = mIvDetail.getViewTreeObserver();
        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onGlobalLayout() {
                mIvDetail.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                height = mIvDetail.getHeight();
            }
        });
    }
}

activity_main.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <fanruiqi.bwie.com.extents.ObservableScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/iv_detail"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:src="@mipmap/ic_launcher_round"
                />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="5dp">

                <TextView
                    android:id="@+id/tv_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="7dp"
                    android:text="北京顏值擔當"
                    android:textSize="23dp"/>

                <RelativeLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="5dp">

                    <TextView
                        android:id="@+id/tv_decs"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="英俊瀟灑,風流倜儻"
                        android:textSize="13dp"/>

                    <TextView
                        android:id="@+id/textView"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:layout_toLeftOf="@+id/tv_bought"
                        android:layout_toStartOf="@+id/tv_bought"
                        android:text="已售"/>

                    <TextView
                        android:id="@+id/tv_bought"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentEnd="true"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="10dp"
                        android:layout_marginRight="10dp"
                        android:text="666"/>
                </RelativeLayout>


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:padding="13dp">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal">

                        <ImageView
                            android:layout_width="20dp"
                            android:layout_height="20dp"
                            android:src="@mipmap/ic_launcher_round"/>

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            android:layout_marginLeft="5dp"
                            android:text="隨時退"
                            android:textSize="17dp"/>
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="5dp"
                        android:orientation="horizontal">

                        <ImageView
                            android:layout_width="20dp"
                            android:layout_height="20dp"
                            android:src="@mipmap/ic_launcher_round"/>

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            android:layout_marginLeft="5dp"
                            android:text="隨時退"
                            android:textSize="17dp"/>
                    </LinearLayout>

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="5dp"
                        android:orientation="horizontal">

                        <ImageView
                            android:layout_width="20dp"
                            android:layout_height="20dp"
                            android:src="@mipmap/ic_launcher_round"/>

                        <TextView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            android:layout_marginLeft="5dp"
                            android:text="隨時退"
                            android:textSize="17dp"/>
                    </LinearLayout>
                </LinearLayout>


                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:orientation="vertical">

                    <TextView

                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="商家資訊"
                        android:textSize="18.0sp"/>


                    <TextView
                        android:id="@+id/tv_title2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="北京燕山電影院"
                        android:textSize="17dp"/>

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal"
                        android:padding="5dp">

                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_weight="2"
                            android:orientation="vertical"
                            android:padding="5dp">

                            <TextView
                                android:id="@+id/tv_address"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_weight="1"
                                android:text="北京房山區燕山崗南路9號"/>

                            <TextView
                                android:id="@+id/tv_time"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="5dp"
                                android:layout_weight="1"
                                android:text="兩件事你需要關注--第一,保持現有的;第二,持續發展。我們要保持這種風格,不靠噱頭和花招。同時,要在不破壞現有水準的前提下,關注那些持續發展的、容易擴大規模的產品或趨勢。--馬克.扎克伯格
在Facebook公司成立10週年,馬克.扎克伯格一方面強調了公司要腳踏實地保持現有領域的領先地位,一方面要關注新技術,新方向.
管理公司如此,學習知識亦是相同,一方面要把之前所學溫故知新一遍,另一方也要關注Android最近發展流行的新技術,銳意進取;
本課程的目標就是為了在鞏固同學們基礎的同時進一步提高學生android專業的深度和寬度,使其成為一名合格的Android高階工程師,適應當今Android開發相當火熱,但是高階Android開發人員卻比較少的市場需求,達成學生高薪就業和緩解企業人才渴求的雙重目標
本課程面向的是具備一定Android基礎的人群,內容突出實戰和知識的體系性,通過本課程的學習,使學生把之前積累的種種知識,溫習一遍後,又加入了Android程式即時通訊,XMPP,訊飛語音開發,RxAndroid,retrofit,Fresco,GreedDao等當今Android的主流框架以及APK瘦身加固,多渠道打包,Java8,版本更新,斷點續傳,百分比適配等Android工程師必備知識點,最後帶著學生閱讀Android的library層核心類的原始碼,完成從量變進行質變, 鯉魚跳龍門這一過程,脫胎換骨,成就大神之路。
準備好了嗎!讓我開啟這場生動有趣又充滿挑戰的Android進階旅程吧!
 學習知識要善於思考,思考,再思考。 —— 愛因斯坦
本課程在教學過程中,重在引導學生思考,遇到問題怎麼構思解決思路,多提問,提高學生解決實際問題的能力;培養學生自學能力,把教學中參考的demo,網址,以及專案的最終效果GIF圖等分享給學生,再授課前先讓學生研究預習,再進行講解,正所謂授人以魚不如授人以漁,使學生離開學校,也能適應日新月異的IT發展;鍛鍊學生語言溝通能力,使其在日後的面試過程中,能遊刃有餘的應對面試官的提問
在授課過程中,主要分為三部分:一是:分析使用新技術完成專案的實現思路,在開始敲程式碼前,先把程式碼實現的大致步驟,給學生解釋清楚,這裡主要用的是visio流程圖,Raptor圖和註釋;二是:對新技術原理或者完成專案中某個特定需求用到的演算法,進行剖析,最好以圖文結合的形式,給學生講解這些抽象的東西,通過文字詳細描述概念,通過畫圖說明加深學生的理解和記憶;三是:總結回顧,使用思維導圖,將一天學習的知識點進行梳理,因為本門課程,知識點較多,且難度較大,教授完課程,學生很難在大腦中長久記憶與靈活運用,此時再帶著學生,根據核心技術點做為主幹,擴充套件到實際運用中,以分支的形式體現,把使用這個技術點,容易產生什麼問題,怎麼解決,最後完成專案後能否進行優化,都複習一遍;最後是:檢查學生口述能力,每天所學技術點,都要求學生做到流利的說上一遍,具體到這個技術,第一步怎麼做,第二步怎麼做,第三步進行時有什麼問題,怎麼解決,第四步完成效果,第五步效果完成,怎麼進行優化,為以後面試的語言表達能力打下堅實的基礎。"/>

                        </LinearLayout>

                        <ImageView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            android:layout_weight="1"
                            android:src="@mipmap/ic_launcher_round"/>
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </fanruiqi.bwie.com.extents.ObservableScrollView>

    <RelativeLayout
        android:id="@+id/layout_title"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_gravity="top"
        android:padding="5dp">

        <TextView
            android:id="@+id/tv_titlebar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:textColor="#ff666666"
            android:textSize="20dp"
            android:visibility="gone"/>
    </RelativeLayout>

</RelativeLayout>

ObservableScrollView.java

public class ObservableScrollView extends ScrollView{
    public ObservableScrollView(Context context) {
        this(context,null);
    }

    public ObservableScrollView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public ObservableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mSVListener!=null){
            mSVListener.OnScrollChanger(this,l,t,oldl,oldt);
        }
    }

    public interface SVListener{
        void OnScrollChanger(ObservableScrollView scrollView,int l, int t, int oldl, int oldt);
    }

    private SVListener mSVListener;

    public void setSVListener(SVListener svListener){

        mSVListener=svListener;
    }

}