Android 雙緩沖 使用 示例

本文參考文獻(xiàn):《瘋狂Android講義(第2版)》

自定義視圖:

package com.toby.personal.testlistview;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.MaskFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by toby on 2017/4/10.
 */

public class DrawView extends View {

    private final static int VIEW_WIDTH = 720;
    private final static int VIEW_HEIGHT = 1280;

    private float preX;
    private float preY;
    private Path path;
    private Paint paint = null;
    private Paint bmpPaint = null;
    private Bitmap cacheBitmap = null;
    private Canvas cacheCanvas = null;

    public DrawView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        cacheBitmap = Bitmap.createBitmap(VIEW_WIDTH, VIEW_HEIGHT, Bitmap.Config.ARGB_8888);
        cacheCanvas = new Canvas();
        path = new Path();
        cacheCanvas.setBitmap(cacheBitmap);

        paint = new Paint(Paint.DITHER_FLAG);
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(1);
        paint.setAntiAlias(true);
        paint.setDither(true);

        bmpPaint = new Paint();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(x, y);
                preX = x;
                preY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                path.quadTo(preX, preY, x, y);
                preX = x;
                preY = y;
                break;
            case MotionEvent.ACTION_UP:
                cacheCanvas.drawPath(path, paint);
                path.reset();
                break;
        }
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);
        canvas.drawPath(path, paint);
    }

    public void setColor(int color){
        paint.setColor(color);
    }

    public void setStrokeWidth(float width){
        paint.setStrokeWidth(width);
    }

    public void setMaskFilter(MaskFilter maskFilter){
        paint.setMaskFilter(maskFilter);
    }
}

自定義 menu 資源文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="@string/color">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/red"
                    android:title="@string/color_red" />
                <item
                    android:id="@+id/green"
                    android:title="@string/color_green" />
                <item
                    android:id="@+id/blue"
                    android:title="@string/color_blue" />
            </group>
        </menu>
    </item>

    <item android:title="@string/width">
        <menu>
            <group>
                <item
                    android:id="@+id/width_1"
                    android:title="@string/width_1" />
                <item
                    android:id="@+id/width_3"
                    android:title="@string/width_3" />
                <item
                    android:id="@+id/width_5"
                    android:title="@string/width_5" />
            </group>
        </menu>
    </item>

    <item
        android:id="@+id/blur"
        android:title="@string/blur" />

    <item
        android:id="@+id/emboss"
        android:title="@string/emboss" />
</menu>

主布局文件的內(nèi)容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorGray"
    android:orientation="vertical"
    android:id="@+id/container"
    >

    <com.toby.personal.testlistview.DrawView
        android:id="@+id/drawView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

主程序文件的內(nèi)容:

package com.toby.personal.testlistview;

import android.graphics.BlurMaskFilter;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    final private static String TAG = "Toby_Test";

    EmbossMaskFilter emboss;
    BlurMaskFilter blur;

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

        emboss = new EmbossMaskFilter(new float[]{1.5f, 1.5f, 1.5f}, 0.6f, 6, 4.2f);
        blur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.test_menu01, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        DrawView drawView = (DrawView) findViewById(R.id.drawView);

        switch (item.getItemId()){
            case R.id.red:
                drawView.setColor(Color.RED);
                item.setChecked(true);
                break;
            case R.id.green:
                drawView.setColor(Color.GREEN);
                item.setChecked(true);
                break;
            case R.id.blue:
                drawView.setColor(Color.BLUE);
                item.setChecked(true);
                break;
            case R.id.width_1:
                drawView.setStrokeWidth(1);
                break;
            case R.id.width_3:
                drawView.setStrokeWidth(3);
                break;
            case R.id.width_5:
                drawView.setStrokeWidth(5);
                break;
            case R.id.blur:
                drawView.setMaskFilter(blur);
                break;
            case R.id.emboss:
                drawView.setMaskFilter(emboss);
                break;
        }

        return true;
    }
}

運行效果:

顯示效果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莹痢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竞膳,老刑警劉巖航瞭,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坦辟,居然都是意外死亡刊侯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門锉走,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滨彻,“玉大人,你說我怎么就攤上這事挪蹭⊥ざ” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵梁厉,是天一觀的道長辜羊。 經(jīng)常有香客問我,道長词顾,這世上最難降的妖魔是什么八秃? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮肉盹,結(jié)果婚禮上昔驱,老公的妹妹穿的比我還像新娘。我一直安慰自己上忍,他們只是感情好骤肛,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睡雇,像睡著了一般萌衬。 火紅的嫁衣襯著肌膚如雪饮醇。 梳的紋絲不亂的頭發(fā)上它抱,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音朴艰,去河邊找鬼观蓄。 笑死,一個胖子當(dāng)著我的面吹牛祠墅,可吹牛的內(nèi)容都是我干的侮穿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼毁嗦,長吁一口氣:“原來是場噩夢啊……” “哼亲茅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤克锣,失蹤者是張志新(化名)和其女友劉穎茵肃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭祟,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡验残,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巾乳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片您没。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胆绊,靈堂內(nèi)的尸體忽然破棺而出氨鹏,到底是詐尸還是另有隱情,我是刑警寧澤压状,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布喻犁,位于F島的核電站,受9級特大地震影響何缓,放射性物質(zhì)發(fā)生泄漏肢础。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一碌廓、第九天 我趴在偏房一處隱蔽的房頂上張望传轰。 院中可真熱鬧,春花似錦谷婆、人聲如沸慨蛙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽期贫。三九已至,卻和暖如春异袄,著一層夾襖步出監(jiān)牢的瞬間通砍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工烤蜕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留封孙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓讽营,卻偏偏與公主長得像虎忌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子橱鹏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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