自定義波紋點(diǎn)擊效果的Button

背景

不知道大家在開發(fā)md風(fēng)格的項(xiàng)目中斥扛,各種形狀各種顏色的Button是怎么實(shí)現(xiàn)的入问,對(duì)于我這樣的一個(gè)菜鳥來(lái)說(shuō),就傻傻的一種樣式寫一個(gè)<ripple/>,這樣一個(gè)項(xiàng)目下來(lái)包含大量定義按鈕樣式的xml文件芬失,不但看著蛋疼卷仑,后期維護(hù)起來(lái)也非常惱火,于是乎開始自定義按鈕吧麸折。

自定義按鈕

說(shuō)起自定義View其實(shí)并不難锡凝,這里的自定義Button更加簡(jiǎn)單,都不用重寫onDraw垢啼、onLayout窜锯、onMeasure等方法,那就直接上代碼芭析,是在不明白的同學(xué)請(qǐng)學(xué)習(xí)下自定義控件的基礎(chǔ)知識(shí)锚扎。
首先是直接在項(xiàng)目的res/values下新建一個(gè)attrs.xml文件,然后在里面定義一些可能用到的屬性

<!--自定義Button屬性-->
    <declare-styleable name="CustomButton">
        <attr name="bgColor" format="color" />
        <attr name="bgColorPress" format="color" />
        <attr name="bgColorDisable" format="color" />
        <attr name="textColor" format="color" />
        <attr name="textColorPress" format="color" />
        <attr name="textColorDisable" format="color" />
        <attr name="cornersRadius" format="float" />
        <attr name="shape">
            <enum name="rectangle" value="0" />
            <enum name="oval" value="1" />
            <enum name="line" value="2" />
            <enum name="ring" value="3" />
        </attr>
        <attr name="strokeWidth" format="integer" />
        <attr name="strokeColor" format="color" />
        <attr name="rippleColor" format="color" />
    </declare-styleable>

這里根據(jù)需求定義了以上屬性,當(dāng)如如果有更復(fù)雜的需求就定義相應(yīng)的屬性,各位大神自由發(fā)揮瓶盛。
然后就是新建一個(gè)類CustomButton繼承自Button,把所有屬性列舉出來(lái)翠勉,然后獲取相應(yīng)屬性的值即可,由于比較簡(jiǎn)單霉颠,注釋也比較詳細(xì)对碌,就直接貼代碼了
CustomButton.java

package com.liuqiang.customviewlibrary;

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.RippleDrawable;
import android.graphics.drawable.StateListDrawable;
import android.util.AttributeSet;
import android.widget.Button;

/**
 * Created by liuqiang on 2017/11/3.
 * 自定義帶波紋點(diǎn)擊效果的Button,支持圓角矩形蒿偎,圓形按鈕等樣式朽们,可通過(guò)配置文件改變按下后的樣式
 */
public class CustomButton extends Button {
    private static String TAG = "CustomButton";
    private Context mContext;
    /**
     * 按鈕的背景色
     */
    private int bgColor = 0;
    /**
     * 按鈕被按下時(shí)的背景色
     */
    private int bgColorPress = 0;
    /**
     * 按鈕不可用的背景色
     */
    private int bgColorDisable = 0;

    /**
     * 按鈕正常時(shí)文字的顏色
     */
    private int textColor;
    /**
     * 按鈕被按下時(shí)文字的顏色
     */
    private int textColorPress;
    /**
     * 按鈕不可點(diǎn)擊時(shí)文字的顏色
     */
    private int textColorDisable;
    /**
     * 按鈕的形狀
     */
    private int shapeType;
    /**
     * 矩形時(shí)有效,4個(gè)角的radius
     */
    private float cornersRadius;
    /**
     * 邊框線寬度
     */
    private int strokeWidth = 0;
    /**
     * 邊框線顏色
     */
    private int strokeColor;

    private ColorStateList rippleColor;


    //shape的樣式
    public static final int RECTANGLE = 0;
    public static final int OVAL = 1;
    public static final int LINE = 2;
    public static final int RING = 3;



    private GradientDrawable gradientDrawable = null;



    public CustomButton(Context context) {
        this(context,null);
    }

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

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        getAttr(attrs);
        init();
    }

    private void getAttr(AttributeSet attrs) {
        if (attrs == null) {
            return;
        }
        TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.CustomButton);
        if (a != null) {
            bgColor = a.getColor(R.styleable.CustomButton_bgColor, 0);
            bgColorPress = a.getColor(R.styleable.CustomButton_bgColorPress, 0);
            bgColorDisable = a.getColor(R.styleable.CustomButton_bgColorDisable, 0);

            textColor = a.getColor(R.styleable.CustomButton_textColor, 0);
            textColorPress = a.getColor(R.styleable.CustomButton_textColorPress, 0);
            textColorDisable = a.getColor(R.styleable.CustomButton_textColorDisable, 0);

            shapeType = a.getInt(R.styleable.CustomButton_shape, GradientDrawable.RECTANGLE);
            cornersRadius = a.getFloat(R.styleable.CustomButton_cornersRadius, 0);

            strokeWidth = a.getInteger(R.styleable.CustomButton_strokeWidth,0);
            strokeColor = a.getColor(R.styleable.CustomButton_strokeColor,0);

            rippleColor = a.getColorStateList(R.styleable.CustomButton_rippleColor);
            if (rippleColor == null || rippleColor.getDefaultColor() == 0) {
                rippleColor = createRippleColorStateList(Color.GRAY);
            }
        }
    }
    private void init() {
        setClickable(true);
//        setBackground(getDrawable(android.R.attr.state_enabled));
        setBackground(getSelector());
        setTextColor(createColorStateList());
    }

    /**
     * 設(shè)置GradientDrawable
     *
     * @param state 按鈕狀態(tài)
     * @return gradientDrawable
     */
    public GradientDrawable getDrawable(int state) {
        gradientDrawable = new GradientDrawable();
        setShape();
        setBorder();
        setRadius();
        setSelectorColor(state);
        return gradientDrawable;
    }

    /**
     * 設(shè)置shape類型
     */
    private void setShape() {

        switch (shapeType) {
            case RECTANGLE:
                gradientDrawable.setShape(GradientDrawable.RECTANGLE);
                break;
            case OVAL:
                gradientDrawable.setShape(GradientDrawable.OVAL);
                break;
            case LINE:
                gradientDrawable.setShape(GradientDrawable.LINE);
                break;
            case RING:
                gradientDrawable.setShape(GradientDrawable.RING);
                break;
        }
    }
    /**
     * 設(shè)置邊框  寬度  顏色  虛線  間隙
     */
    private void setBorder() {
        gradientDrawable.setStroke(strokeWidth, strokeColor, 0, 0);
    }

    /**
     * 只有類型是矩形的時(shí)候設(shè)置圓角半徑才有效
     */
    private void setRadius() {
        if (shapeType == GradientDrawable.RECTANGLE) {
            if (cornersRadius != 0) {
                gradientDrawable.setCornerRadius(cornersRadius);//設(shè)置圓角的半徑
            }
        }
    }

    /**
     * 設(shè)置Selector的不同狀態(tài)的顏色
     *
     * @param state 按鈕狀態(tài)
     */
    private void setSelectorColor(int state) {
        switch (state) {
            case android.R.attr.state_pressed:
                gradientDrawable.setColor(bgColorPress);
                break;
            case -android.R.attr.state_enabled:
                gradientDrawable.setColor(bgColorDisable);
                break;
            case android.R.attr.state_enabled:
                gradientDrawable.setColor(bgColor);
                break;
        }
    }

    /**
     * 設(shè)置按鈕的Selector
     *
     * @return stateListDrawable
     */
    public Drawable getSelector() {
        StateListDrawable stateListDrawable = new StateListDrawable();
        //注意該處的順序诉位,只要有一個(gè)狀態(tài)與之相配骑脱,背景就會(huì)被換掉
        //所以不要把大范圍放在前面了,如果sd.addState(new[]{},normal)放在第一個(gè)的話苍糠,就沒有什么效果了
        stateListDrawable.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, getDrawable(android.R.attr.state_pressed));
        stateListDrawable.addState(new int[]{-android.R.attr.state_enabled}, getDrawable(-android.R.attr.state_enabled));
        stateListDrawable.addState(new int[]{}, getDrawable(android.R.attr.state_enabled));

        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
            return stateListDrawable;
        }else{

            RippleDrawable rippleDrawable = new RippleDrawable(rippleColor,stateListDrawable,null);
            return rippleDrawable;
        }
    }
    /** 設(shè)置不同狀態(tài)時(shí)其文字顏色 */
    private ColorStateList createColorStateList() {
        int[] colors = new int[] { textColorPress, textColorDisable, textColor};
        int[][] states = new int[3][];
        states[0] = new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled };
        states[1] = new int[] { -android.R.attr.state_enabled};
        states[2] = new int[] { android.R.attr.state_enabled };
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }

    /** 設(shè)置默認(rèn)ripple顏色 */
    private ColorStateList createRippleColorStateList(int color) {
        int[] colors = new int[] {color};
        int[][] states = new int[1][];
        states[0] = new int[] { };
        ColorStateList colorList = new ColorStateList(states, colors);
        return colorList;
    }

    /////////////////對(duì)外暴露的方法//////////////

    /**
     * 設(shè)置Shape類型
     *
     * @param type 類型
     * @return 對(duì)象
     */
    public CustomButton setShapeType(int type) {
        this.shapeType = type;
        return this;
    }


    /**
     * 設(shè)置按下的顏色
     *
     * @param color 顏色
     * @return 對(duì)象
     */
    public CustomButton setBgPressedColor(int color) {
        this.bgColorPress = getResources().getColor(color);
        return this;
    }

    /**
     * 設(shè)置正常的顏色
     *
     * @param color 顏色
     * @return 對(duì)象
     */
    public CustomButton setBgNormalColor(int color) {
        this.bgColor = getResources().getColor(color);
        return this;
    }

    /**
     * 設(shè)置不可點(diǎn)擊的顏色
     *
     * @param color 顏色
     * @return 對(duì)象
     */
    public CustomButton setBgDisableColor(int color) {
        this.bgColorDisable = getResources().getColor(color);
        return this;
    }

    /**
     * 設(shè)置按下的顏色
     *
     * @param color 顏色
     * @return 對(duì)象
     */
    public CustomButton setTextPressedColor(int color) {
        this.textColorPress = getResources().getColor(color);
        return this;
    }

    /**
     * 設(shè)置正常的顏色
     *
     * @param color 顏色
     * @return 對(duì)象
     */
    public CustomButton setTextNormalColor(int color) {
        this.textColor = getResources().getColor(color);
        return this;
    }

    /**
     * 設(shè)置不可點(diǎn)擊的顏色
     *
     * @param color 顏色
     * @return 對(duì)象
     */
    public CustomButton setTextDisableColor(int color) {
        this.textColorDisable = getResources().getColor(color);
        return this;
    }

    /**
     * 設(shè)置邊框?qū)挾?     *
     * @param strokeWidth 邊框?qū)挾戎?     * @return 對(duì)象
     */
    public CustomButton setStrokeWidth(int strokeWidth) {
        this.strokeWidth = strokeWidth;
        return this;
    }

    /**
     * 設(shè)置邊框顏色
     *
     * @param strokeColor 邊框顏色
     * @return 對(duì)象
     */
    public CustomButton setStrokeColor(int strokeColor) {
        this.strokeColor = getResources().getColor(strokeColor);
        return this;
    }


    /**
     * 設(shè)置圓角半徑
     *
     * @param radius 半徑
     * @return 對(duì)象
     */
    public CustomButton setCornersRadius(float radius) {
        this.cornersRadius = radius;
        return this;
    }

    public CustomButton setRippleColor(int color){
        this.rippleColor = createRippleColorStateList(getResources().getColor(color));
        return this;
    }

    /**
     * 使用shape
     * 所有與shape相關(guān)的屬性設(shè)置之后調(diào)用此方法才生效
     */
    public void use() {
        init();
    }


    /**
     * 單位轉(zhuǎn)換工具類
     *
     * @param context  上下文對(duì)象
     * @param dipValue 值
     * @return 返回值
     */
    private int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

}

在應(yīng)用主題是md主題的情況下叁丧,默認(rèn)的按鈕是自帶波紋點(diǎn)擊效果的,如果用<ripple/>作為按鈕的background是完全沒問題的椿息,但在自定義的按鈕中設(shè)置了按鈕的背景色歹袁,波紋效果就會(huì)消失,剛開始想不到辦法解決寝优,網(wǎng)上搜索的自定義波紋點(diǎn)擊按鈕都是要自己繪制,稍顯復(fù)雜枫耳,優(yōu)點(diǎn)是可以兼容5.0以下的版本乏矾。于是只能自己摸索,終于找到了一個(gè)簡(jiǎn)單方法。<ripple/>標(biāo)簽最終都會(huì)被解析成RippleDrawable钻心,可不可以直接實(shí)例化一個(gè)RippleDrawable呢凄硼,答案是可以的,直接看上面的代碼捷沸,主要代碼就這一段:

/**
     * 設(shè)置按鈕的Selector
     *
     * @return stateListDrawable
     */
    public Drawable getSelector() {
        StateListDrawable stateListDrawable = new StateListDrawable();
        //注意該處的順序摊沉,只要有一個(gè)狀態(tài)與之相配,背景就會(huì)被換掉
        //所以不要把大范圍放在前面了痒给,如果sd.addState(new[]{},normal)放在第一個(gè)的話说墨,就沒有什么效果了
        stateListDrawable.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, getDrawable(android.R.attr.state_pressed));
        stateListDrawable.addState(new int[]{-android.R.attr.state_enabled}, getDrawable(-android.R.attr.state_enabled));
        stateListDrawable.addState(new int[]{}, getDrawable(android.R.attr.state_enabled));

        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
            return stateListDrawable;
        }else{

            RippleDrawable rippleDrawable = new RippleDrawable(rippleColor,stateListDrawable,null);
            return rippleDrawable;
        }
    }

在設(shè)置按鈕的背景drawable之前,實(shí)例化一個(gè)RippleDrawable苍柏。
第一參數(shù)就是波紋顏色尼斧;
第二個(gè)參數(shù)是平時(shí)我們?cè)O(shè)置的按鈕背景selector,如果直接用selector作為背景是沒有波紋點(diǎn)擊效果的试吁,這里直接把xml轉(zhuǎn)化成StateListDrawable棺棵,然后再作為RippleDrawable的content;
第三個(gè)參數(shù)是控制波紋范圍的drawable熄捍,這里直接傳null烛恤。
好了,自定義帶波紋效果的Button完成余耽,代碼很簡(jiǎn)單棒动,注釋也比較細(xì),就不多解釋了宾添。代碼傳送門

用法

xml方式

app:shape="rectangle" 設(shè)置按鈕的形狀船惨,矩形(包括帶圓角的矩形)、圓形缕陕、線形粱锐、環(huán)形(環(huán)形一直顯示不對(duì),不知道怎么回事)
app:bgColor="@color/colorPrimary" 按鈕可點(diǎn)擊時(shí)的背景色
app:bgColorPress="@color/colorPrimaryDark" 按鈕按下時(shí)的背景色
app:bgColorDisable="@color/white" 按鈕不可用時(shí)的背景色
app:cornersRadius="20" 當(dāng)shape為矩形時(shí)的圓角角度
app:strokeWidth="10" 邊線寬
app:strokeColor="@color/black" 邊線顏色
app:textColor="@color/white" 按鈕正常狀態(tài)時(shí)的文字顏色
app:textColorPress="@color/black" 按鈕被按下時(shí)的文字顏色
app:textColorDisable="@color/gray" 按鈕不可用時(shí)文字顏色
app:rippleColor="@color/colorAccent" 按鈕被觸摸時(shí)的波紋顏色
注意自定義命名空間 xmlns:app="http://schemas.android.com/apk/res-auto"

<com.liuqiang.customviewlibrary.CustomButton
            android:id="@+id/customButton"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="自定義按鈕(xml設(shè)置)"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:gravity="center"

            app:shape="rectangle"
            app:bgColor="@color/colorPrimary"
            app:bgColorPress="@color/colorPrimaryDark"
            app:bgColorDisable="@color/white"
            app:cornersRadius="20"
            app:strokeWidth="10"
            app:strokeColor="@color/black"
            app:textColor="@color/white"
            app:textColorPress="@color/black"
            app:textColorDisable="@color/gray"
            app:rippleColor="@color/colorAccent"
    />

代碼方式

customButton_code = (CustomButton) findViewById(R.id.customButton1);
        customButton_code.setShapeType(CustomButton.RECTANGLE)
                .setBgNormalColor(R.color.colorPrimary)
                .setBgPressedColor(R.color.colorPrimaryDark)
                .setBgDisableColor(R.color.white)
                .setCornersRadius(20)
                .setStrokeColor(R.color.black)
                .setStrokeWidth(10)
                .setTextNormalColor(R.color.white)
                .setTextPressedColor(R.color.black)
                .setTextDisableColor(R.color.gray)
                .setRippleColor(R.color.colorAccent)
                .use();

注意設(shè)置完屬性后記得調(diào)用use()方法扛邑。

總結(jié)

如果你也在苦惱按鈕的樣式太多怜浅,需要寫大量的<ripple/><shape/>等xml文件,不妨用這種方式蔬崩,擴(kuò)展性也非常強(qiáng)恶座,包括顏色漸變、點(diǎn)擊動(dòng)畫等沥阳。歡迎

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跨琳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桐罕,更是在濱河造成了極大的恐慌脉让,老刑警劉巖桂敛,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異溅潜,居然都是意外死亡术唬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門滚澜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粗仓,“玉大人,你說(shuō)我怎么就攤上這事设捐〗枳牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵挡育,是天一觀的道長(zhǎng)巴碗。 經(jīng)常有香客問我,道長(zhǎng)即寒,這世上最難降的妖魔是什么橡淆? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮母赵,結(jié)果婚禮上逸爵,老公的妹妹穿的比我還像新娘。我一直安慰自己凹嘲,他們只是感情好师倔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著周蹭,像睡著了一般趋艘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凶朗,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天瓷胧,我揣著相機(jī)與錄音,去河邊找鬼棚愤。 笑死搓萧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宛畦。 我是一名探鬼主播瘸洛,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼次和!你這毒婦竟也來(lái)了反肋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斯够,失蹤者是張志新(化名)和其女友劉穎囚玫,沒想到半個(gè)月后喧锦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體读规,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抓督,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了束亏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铃在。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碍遍,靈堂內(nèi)的尸體忽然破棺而出定铜,到底是詐尸還是另有隱情,我是刑警寧澤怕敬,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布揣炕,位于F島的核電站,受9級(jí)特大地震影響东跪,放射性物質(zhì)發(fā)生泄漏畸陡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一虽填、第九天 我趴在偏房一處隱蔽的房頂上張望丁恭。 院中可真熱鬧,春花似錦斋日、人聲如沸牲览。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)第献。三九已至,卻和暖如春兔港,著一層夾襖步出監(jiān)牢的瞬間庸毫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工押框, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岔绸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓橡伞,卻偏偏與公主長(zhǎng)得像盒揉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兑徘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 今天下午刚盈,某位老師在我的一篇日記下面留評(píng):沒水平 不是我忘寫了句號(hào),就是這三個(gè)字挂脑,沒有標(biāo)點(diǎn)符號(hào)藕漱。 ...
    劉一鳴媽媽閱讀 831評(píng)論 34 13
  • 因?yàn)闊o(wú)證之罪收視率狂飆欲侮,最近紫金陳很火。 迷上紫金陳的小說(shuō)已經(jīng)有好一陣了肋联,被譽(yù)為“中國(guó)的東野圭吾”威蕉,雖然人物刻畫不...
    Amirazhou閱讀 1,897評(píng)論 0 0
  • 今天看《西游記》,越看越有味道橄仍,原來(lái)我們學(xué)習(xí)的《西游記》也是一部找回靈魂的游記韧涨,我們唐僧就相當(dāng)于我們的靈魂,...
    育心經(jīng)典易根大學(xué)曲鳳閱讀 159評(píng)論 0 0