仿微信底部欄圖標(biāo)切換時(shí),顏色漸變效果

原創(chuàng)作者:AchillesL
若轉(zhuǎn)載文章,請(qǐng)?jiān)诿黠@的位置標(biāo)明文章出處

1. 前言

??使用微信時(shí)被济,我們會(huì)發(fā)現(xiàn):進(jìn)行頁面切換時(shí)蛋勺,底部標(biāo)題欄的圖片會(huì)發(fā)生顏色深淺的變化羡宙。
??本文將介紹這種效果是如何實(shí)現(xiàn)的孵坚,最終效果如圖1所示。

圖1最終效果

2. 知識(shí)點(diǎn)

ArgbEvaluator.evaluate方法:

該方法用于根據(jù)一個(gè)起始顏色值和一個(gè)結(jié)束顏色值以及一個(gè)偏移量生成一個(gè)新的顏色滞时。

DrawableCompat.setTintList方法:

通過該方法叁幢,可以動(dòng)態(tài)地給圖片進(jìn)行著色處理。對(duì)于具體的用法坪稽,可以參考一下文章:http://www.reibang.com/p/6bd7dd1cd491 本文不再講述曼玩。

3. 準(zhǔn)備工作

??我們創(chuàng)建一個(gè)Demo。Activity中包含一個(gè)ViewPager控件窒百,并利用LinearLayout實(shí)現(xiàn)底部標(biāo)題欄黍判。
??布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.achillesl.bottombar.MainActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#eeeeee"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        >

        <ImageView
            android:id="@+id/ivOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            tools:src="@drawable/ic_action_alarm"/>

        <ImageView
            android:id="@+id/ivTwo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            tools:src="@drawable/ic_action_amazon"/>

        <ImageView
            android:id="@+id/ivThree"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            tools:src="@drawable/ic_action_anchor"/>

        <ImageView
            android:id="@+id/ivFour"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            tools:src="@drawable/ic_action_android"/>
    </LinearLayout>
</LinearLayout>

??主界面代碼:

package com.achillesl.bottombar;

import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;

    private List<TextView> mTipList = new ArrayList<>();
    //使用List存放ImageView對(duì)象
    private List<ImageView> mBottomImageViews = new ArrayList<>();
    //使用List存放ImageView對(duì)應(yīng)的圖片資源
    private List<Drawable> mBottomImageDrawables = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initTipList();
        initImageViewDrawable();

        // TODO: 2016/11/13 設(shè)置ViewPager的頁面數(shù)
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
        mViewPager.setAdapter(new PagerAdapter() {

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView(mTipList.get(position));
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                TextView textView = mTipList.get(position);
                container.addView(textView);
                return textView;
            }

            @Override
            public int getCount() {
                return 4;
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        });
    }

    private void initImageViewDrawable() {
        mBottomImageViews.add((ImageView) findViewById(R.id.ivOne));
        mBottomImageViews.add((ImageView) findViewById(R.id.ivTwo));
        mBottomImageViews.add((ImageView) findViewById(R.id.ivThree));
        mBottomImageViews.add((ImageView) findViewById(R.id.ivFour));

        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_alarm).mutate());
        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_amazon).mutate());
        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_anchor).mutate());
        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_android).mutate());
    }

    private void initTipList() {
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams
                .MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        for (int i = 0; i < 4; i++) {
            TextView textView = new TextView(this);
            textView.setText("第" + (i + 1) + "個(gè)頁面");
            textView.setLayoutParams(layoutParams);
            textView.setGravity(Gravity.CENTER);
            mTipList.add(textView);
        }
    }
}

??上面代碼中,我們使用List統(tǒng)一管理圖片資源篙梢、ImageView實(shí)例顷帖。

4. 顏色漸變

4.1 設(shè)置圖標(biāo)初始顏色

??這一步,我們將設(shè)置底部標(biāo)題欄圖標(biāo)的顏色渤滞。選擇的顏色為藍(lán)色贬墩,未選中的藍(lán)色為灰色。

4.1.1 定義并初始化顏色

在color.xml文件中定義顏色

<color name="buttonSelect">#3F51B5</color>
<color name="buttonUnSelect">#a4a3a3</color>

4.1.2 在Activity中添加變量

private int mBottomColorSelect;
private int mBottomColorUnSelect;

4.1.3 設(shè)置不同圖標(biāo)的顏色

??添加setImageViewSelect方法妄呕,代碼如下:

private void setImageViewSelect(int selectIndex) {
    for (int index = 0; index < mBottomImageViews.size(); index++) {
        ImageView imageView = mBottomImageViews.get(index);
        Drawable drawable = mBottomImageDrawables.get(index);
        if (index == selectIndex) {
            imageView.setImageDrawable(tintDrawable(drawable, ColorStateList.valueOf
                    (mBottomColorSelect)));
        } else {
            imageView.setImageDrawable(tintDrawable(drawable, ColorStateList.valueOf
                    (mBottomColorUnSelect)));
        }
    }
}

4.1.4 修改initImageViewDrawable方法

private void initImageViewDrawable() {
    /*Add begin*/
    mBottomColorSelect = ContextCompat.getColor(this, R.color.buttonSelect);
    mBottomColorUnSelect = ContextCompat.getColor(this, R.color.buttonUnSelect);
    /*Add end*/

    mBottomImageViews.add((ImageView) findViewById(R.id.ivOne));
    ...
    mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_android).mutate());

    /*Add begin*/
    setImageViewSelect(0);
    /*Add end*/
}

??此時(shí)陶舞,完成了底部欄圖標(biāo)的初始化,如圖2所示绪励。

圖 2

4.2 設(shè)置ViewPager滑動(dòng)監(jiān)聽

??這時(shí)肿孵,我們需要給ViewPager添加滑動(dòng)監(jiān)聽事件,并且可以聯(lián)想到:顏色的漸變疏魏,應(yīng)該與ViewPager的滑動(dòng)距離有關(guān)停做。
??因此,在監(jiān)聽器的onPageScrolled方法中添加changeImageViewDrawable方法蠢护,根據(jù)ViewPager的滑動(dòng)偏移量雅宾,動(dòng)態(tài)改變圖標(biāo)的顏色养涮。

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            changeImageViewDrawable(position,positionOffset);
        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

4.2.1 編寫changeImageViewDrawable方法

??這一步主要用到ArgbEvaluator類的evaluate方法葵硕,該方法的用法很簡(jiǎn)單:

public Object evaluate(float fraction, Object startValue, Object endValue)

??參數(shù)fraction:
  指起始顏色到目標(biāo)顏色的偏移值眉抬。該值我們用ViewPager的頁面偏移值positionOffset傳入。

??參數(shù)startValue:起始顏色

??參數(shù)endValue:目標(biāo)顏色

??changeImageViewDrawable方法的代碼:

private void changeImageViewDrawable(int position, float positionOffset) {
    ImageView ivFrom = null;
    ImageView ivTo = null;

    Drawable drawableFrom = null;
    Drawable drawableTo = null;

    ivFrom = mBottomImageViews.get(position);
    drawableFrom = mBottomImageDrawables.get(position);

    if (position != mBottomImageDrawables.size() - 1) {
        ivTo = mBottomImageViews.get(position + 1);
        drawableTo = mBottomImageDrawables.get(position + 1);
    } else {
        ivTo = null;
        drawableTo = null;
    }

    if (ivFrom != null) {
        int colorStart = (int) mArgbEvaluator.evaluate(positionOffset, mBottomColorSelect,
                mBottomColorUnSelect);
        Drawable drawableColorStart = tintDrawable(drawableFrom, ColorStateList.valueOf
                (colorStart));
        ivFrom.setImageDrawable(drawableColorStart);
    }
    if (ivTo != null) {
        int colorStart = (int) mArgbEvaluator.evaluate(positionOffset, mBottomColorUnSelect,
                mBottomColorSelect);
        Drawable drawableColorEnd = tintDrawable(drawableTo, ColorStateList.valueOf
                (colorStart));
        ivTo.setImageDrawable(drawableColorEnd);
    }
}

3 小問題優(yōu)化

??實(shí)現(xiàn)具體業(yè)務(wù)時(shí)懈凹,往往點(diǎn)擊底部標(biāo)題欄的圖片時(shí)蜀变,需要切換到具體的頁面。細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn)介评,若起始按鈕與目標(biāo)按鈕相隔較遠(yuǎn)時(shí)库北,其他按鈕圖片上可能遺留“殘影”。
??解決這個(gè)問題很簡(jiǎn)單们陆,只要在ViewPager頁面切換完成時(shí)寒瓦,再一次延時(shí)設(shè)置底部圖標(biāo)的顏色就可以了。

@Override
public void onPageSelected(final int position) {
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            setImageViewSelect(position);
        }
    },DELAY_TIME);
}

全部代碼

package com.achillesl.bottombar;

import android.animation.ArgbEvaluator;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;

    private List<TextView> mTipList = new ArrayList<>();
    //使用List存放ImageView對(duì)象
    private List<ImageView> mBottomImageViews = new ArrayList<>();
    //使用List存放ImageView對(duì)應(yīng)的圖片資源
    private List<Drawable> mBottomImageDrawables = new ArrayList<>();

    private ArgbEvaluator mArgbEvaluator = new ArgbEvaluator();
    private int mBottomColorSelect;
    private int mBottomColorUnSelect;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initTipList();
        initImageViewDrawable();

        // TODO: 2016/11/13 設(shè)置ViewPager的頁面數(shù)
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
        mViewPager.setAdapter(new PagerAdapter() {

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView(mTipList.get(position));
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                TextView textView = mTipList.get(position);
                container.addView(textView);
                return textView;
            }

            @Override
            public int getCount() {
                return 4;
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
        });
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            private final int DELAY_TIME = 100;
            private Handler handler = new Handler();

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                changeImageViewDrawable(position,positionOffset);
            }

            @Override
            public void onPageSelected(final int position) {
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        setImageViewSelect(position);
                    }
                },DELAY_TIME);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void changeImageViewDrawable(int position, float positionOffset) {
        ImageView ivFrom = null;
        ImageView ivTo = null;

        Drawable drawableFrom = null;
        Drawable drawableTo = null;

        ivFrom = mBottomImageViews.get(position);
        drawableFrom = mBottomImageDrawables.get(position);

        if (position != mBottomImageDrawables.size() - 1) {
            ivTo = mBottomImageViews.get(position + 1);
            drawableTo = mBottomImageDrawables.get(position + 1);
        } else {
            ivTo = null;
            drawableTo = null;
        }

        if (ivFrom != null) {
            int colorStart = (int) mArgbEvaluator.evaluate(positionOffset, mBottomColorSelect,
                    mBottomColorUnSelect);
            Drawable drawableColorStart = tintDrawable(drawableFrom, ColorStateList.valueOf
                    (colorStart));
            ivFrom.setImageDrawable(drawableColorStart);
        }
        if (ivTo != null) {
            int colorStart = (int) mArgbEvaluator.evaluate(positionOffset, mBottomColorUnSelect,
                    mBottomColorSelect);
            Drawable drawableColorEnd = tintDrawable(drawableTo, ColorStateList.valueOf
                    (colorStart));
            ivTo.setImageDrawable(drawableColorEnd);
        }
    }

    private void initImageViewDrawable() {
        /*Add begin*/
        mBottomColorSelect = ContextCompat.getColor(this, R.color.buttonSelect);
        mBottomColorUnSelect = ContextCompat.getColor(this, R.color.buttonUnSelect);
        /*Add end*/

        mBottomImageViews.add((ImageView) findViewById(R.id.ivOne));
        mBottomImageViews.add((ImageView) findViewById(R.id.ivTwo));
        mBottomImageViews.add((ImageView) findViewById(R.id.ivThree));
        mBottomImageViews.add((ImageView) findViewById(R.id.ivFour));

        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_alarm).mutate());
        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_amazon).mutate());
        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_anchor).mutate());
        mBottomImageDrawables.add(ContextCompat.getDrawable(this,R.drawable.ic_action_android).mutate());

        for (int i = 0; i < mBottomImageViews.size(); i++) {
            ImageView imageView = mBottomImageViews.get(i);
            final int index = i;
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mViewPager.setCurrentItem(index);
                }
            });
        }

        /*Add begin*/
        setImageViewSelect(0);
        /*Add end*/
    }

    private void setImageViewSelect(int selectIndex) {
        for (int index = 0; index < mBottomImageViews.size(); index++) {
            ImageView imageView = mBottomImageViews.get(index);
            Drawable drawable = mBottomImageDrawables.get(index);
            if (index == selectIndex) {
                imageView.setImageDrawable(tintDrawable(drawable, ColorStateList.valueOf
                        (mBottomColorSelect)));
            } else {
                imageView.setImageDrawable(tintDrawable(drawable, ColorStateList.valueOf
                        (mBottomColorUnSelect)));
            }
        }
    }

    public Drawable tintDrawable(Drawable drawable, ColorStateList colors) {
        final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
        DrawableCompat.setTintList(wrappedDrawable, colors);
        return wrappedDrawable;
    }

    private void initTipList() {
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams
                .MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        for (int i = 0; i < 4; i++) {
            TextView textView = new TextView(this);
            textView.setText("第" + (i + 1) + "個(gè)頁面");
            textView.setLayoutParams(layoutParams);
            textView.setGravity(Gravity.CENTER);
            mTipList.add(textView);
        }
    }
}

代碼地址

??https://github.com/AchillesLzg/jianshu-weixinbottombar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坪仇,一起剝皮案震驚了整個(gè)濱河市杂腰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椅文,老刑警劉巖喂很,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異皆刺,居然都是意外死亡少辣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門羡蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漓帅,“玉大人,你說我怎么就攤上這事林说〖逡螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵腿箩,是天一觀的道長(zhǎng)豪直。 經(jīng)常有香客問我,道長(zhǎng)珠移,這世上最難降的妖魔是什么弓乙? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮钧惧,結(jié)果婚禮上暇韧,老公的妹妹穿的比我還像新娘。我一直安慰自己浓瞪,他們只是感情好懈玻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乾颁,像睡著了一般涂乌。 火紅的嫁衣襯著肌膚如雪艺栈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天湾盒,我揣著相機(jī)與錄音湿右,去河邊找鬼。 笑死罚勾,一個(gè)胖子當(dāng)著我的面吹牛毅人,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尖殃,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼丈莺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了送丰?” 一聲冷哼從身側(cè)響起场刑,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚪战,沒想到半個(gè)月后牵现,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邀桑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瞎疼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁畸。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贼急,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捏萍,到底是詐尸還是另有隱情太抓,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布令杈,位于F島的核電站走敌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逗噩。R本人自食惡果不足惜掉丽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望异雁。 院中可真熱鬧捶障,春花似錦、人聲如沸纲刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锭部,卻和暖如春驱闷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背空免。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盆耽,地道東北人蹋砚。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摄杂,于是被迫代替她去往敵國(guó)和親坝咐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,516評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫析恢、插件墨坚、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 最近一直處于加班的狀態(tài),周末一個(gè)下午也只畫了一張映挂,一幅畫一定要一氣呵成才行泽篮,中間停頓了后面就無從下手了!
    小妖耳子閱讀 343評(píng)論 2 2
  • 有一種親情叫做過年 文/小編 YANN 獨(dú)在異鄉(xiāng)為異客柑船,每逢佳節(jié)倍思親帽撑。王維 長(zhǎng)期漂泊在外的異鄉(xiāng)人,每逢節(jié)氣到來或...
    ISALPARIS閱讀 2,282評(píng)論 0 2
  • 眾所周知鞍时,在線教育打破了名校名師的空間和時(shí)間壁壘亏拉,是教育傳播更加廣泛。然而實(shí)際的現(xiàn)狀表明逆巍,在線教育不僅沒有縮小差距...
    因酷時(shí)代閱讀 240評(píng)論 0 0