自定義View全解,繪一個(gè)動(dòng)態(tài)“飛機(jī)大戰(zhàn)”

feiji.png
本文主要介紹自定義View繪圖的使用把还,上面是一個(gè)可拖動(dòng)的飛機(jī)实蓬,并且不斷發(fā)射出子彈,完全使用自定義View繪圖實(shí)現(xiàn)的動(dòng)態(tài)效果吊履,下面是一組動(dòng)態(tài)效果安皱。
飛機(jī)大戰(zhàn).gif
下面我先介紹一下View中比較重要的幾個(gè)方法跟參數(shù):
  • onFinishlnflate(): 這是一個(gè)回調(diào)方法,當(dāng)應(yīng)用從XML布局文件加載該組件并利用它來(lái)構(gòu)造界面后艇炎,回調(diào)該方法酌伊。
  • onMeasure(int,int):調(diào)用改方法來(lái)檢測(cè)View組件以及所包含的所有子組件的大小。
  • omLayout(boolean,int,int,int,int):當(dāng)該組件需要分配其子組件的位置缀踪,大小時(shí)回調(diào)居砖。
  • onSizeChanged(int,int,int,int):組件的大小發(fā)生改變的時(shí)候回調(diào)。
  • onDraw(Canvas):組件繪制內(nèi)容的時(shí)候調(diào)用該方法進(jìn)行繪制驴娃。
  • onKeyDown(int,KeyEvent):當(dāng)某個(gè)鍵被按下時(shí)觸發(fā)奏候。
  • onKeyUp(int,KeyEvent):松開(kāi)某個(gè)鍵時(shí)觸發(fā)。
  • onTrackballEvent(MotionEvent):發(fā)生軌跡球事件時(shí)觸發(fā)托慨。
  • onTouchEvent(MotionEvent):發(fā)生觸摸屏事件時(shí)觸發(fā)鼻由。
  • onFocusChanged(boolean gainFocus,int direction,Rect previouslyFocusedRect):該組件焦點(diǎn)發(fā)生改變時(shí)觸發(fā)暇榴。
  • onWindowFocusChanged(boolean):包含改組件的窗口失去或者得到焦點(diǎn)時(shí)觸發(fā)。
  • onAttachedToWindow():把該組件放入某個(gè)窗口時(shí)觸發(fā)蕉世。
  • onDetachedFromWindow():把該組件從某個(gè)窗口上分離時(shí)觸發(fā)蔼紧。
  • onWindowVisibilityChanged(int):包含該組件的窗口的可見(jiàn)性發(fā)生改變時(shí)觸發(fā)。
下面是本文的重點(diǎn)狠轻,繪制圖形所涉及的重要幾何圖形繪制方法以及實(shí)例:
  1.     Paint p = new Paint();  
    
  2.     p.setColor(Color.RED);// 設(shè)置紅色  
    
  3.     canvas.drawText("畫(huà)圓:", 10, 20, p);// 畫(huà)文本  
    
  4.     canvas.drawCircle(60, 20, 10, p);// 小圓  
    
  5.     p.setAntiAlias(true);// 設(shè)置畫(huà)筆的鋸齒效果奸例。
    
  6.     canvas.drawCircle(120, 20, 20, p);// 大圓  
    
  7.     canvas.drawText("畫(huà)線及弧線:", 10, 60, p);  
    
  8.     p.setColor(Color.GREEN);// 設(shè)置綠色  
    
  9.     canvas.drawLine(60, 40, 100, 40, p);// 畫(huà)線  
    
  10.     canvas.drawLine(110, 40, 190, 80, p);// 斜線  
    
  11.     //畫(huà)笑臉弧線  
    
  12.     p.setStyle(Paint.Style.STROKE);//設(shè)置空心  
    
  13.     RectF oval1=new RectF(150,20,180,40);  
    
  14.     canvas.drawArc(oval1, 180, 180, false, p);//小弧形  
    
  15.     oval1.set(190, 20, 220, 40);  
    
  16.     canvas.drawArc(oval1, 180, 180, false, p);//小弧形  
    
  17.     oval1.set(160, 30, 210, 60);  
    
  18.     canvas.drawArc(oval1, 0, 180, false, p);//小弧形   
    
  19.     canvas.drawText("畫(huà)矩形:", 10, 80, p);  
    
  20.     p.setColor(Color.GRAY);// 設(shè)置灰色  
    
  21.     p.setStyle(Paint.Style.FILL);//設(shè)置填滿(mǎn)  
    
  22.     canvas.drawRect(60, 60, 80, 80, p);// 正方形  
    
  23.     canvas.drawRect(60, 90, 160, 100, p);// 長(zhǎng)方形  
    
  24.     canvas.drawText("畫(huà)扇形和橢圓:", 10, 120, p);  
    
  25.     /* 設(shè)置漸變色 這個(gè)正方形的顏色是改變的 */  
    
  26.     Shader mShader = new LinearGradient(0, 0, 100, 100,  
    
  27.             new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,  
    
  28.                     Color.LTGRAY }, null, Shader.TileMode.REPEAT); // 一個(gè)材質(zhì),打造出一個(gè)線性梯度沿著一條線。  
    
  29.     p.setShader(mShader);  
    
  30.     // p.setColor(Color.BLUE);  
    
  31.     RectF oval2 = new RectF(60, 100, 200, 240);// 設(shè)置個(gè)新的長(zhǎng)方形向楼,掃描測(cè)量  
    
  32.     canvas.drawArc(oval2, 200, 130, true, p);  
    
  33.     // 畫(huà)弧查吊,第一個(gè)參數(shù)是RectF:該類(lèi)是第二個(gè)參數(shù)是角度的開(kāi)始,第三個(gè)參數(shù)是多少度湖蜕,第四個(gè)參數(shù)是真的時(shí)候畫(huà)扇形逻卖,是假的時(shí)候畫(huà)弧線  
    
  34.     //畫(huà)橢圓,把oval改一下  
    
  35.     oval2.set(210,100,250,130);  
    
  36.     canvas.drawOval(oval2, p);  
    
  37.     canvas.drawText("畫(huà)三角形:", 10, 200, p);  
    
  38.     // 繪制這個(gè)三角形,你可以繪制任意多邊形  
    
  39.     Path path = new Path();  
    
  40.     path.moveTo(80, 200);// 此點(diǎn)為多邊形的起點(diǎn)  
    
  41.     path.lineTo(120, 250);  
    
  42.     path.lineTo(80, 250);  
    
  43.     path.close(); // 使這些點(diǎn)構(gòu)成封閉的多邊形  
    
  44.     canvas.drawPath(path, p);  
    
  45.     // 你可以繪制很多任意多邊形昭抒,比如下面畫(huà)六連形  
    
  46.     p.reset();//重置  
    
  47.     p.setColor(Color.LTGRAY);  
    
  48.     p.setStyle(Paint.Style.STROKE);//設(shè)置空心  
    
  49.     Path path1=new Path();  //Path類(lèi)是連接路徑
    
  50.     path1.moveTo(180, 200);  
    
  51.     path1.lineTo(200, 200);  
    
  52.     path1.lineTo(210, 210);  
    
  53.     path1.lineTo(200, 220);  
    
  54.     path1.lineTo(180, 220);  
    
  55.     path1.lineTo(170, 210);  
    
  56.     path1.close();//封閉  
    
  57.     canvas.drawPath(path1, p);  
    
  58.     //畫(huà)圓角矩形  
    
  59.     p.setStyle(Paint.Style.FILL);//充滿(mǎn)  
    
  60.     p.setColor(Color.LTGRAY);  
    
  61.     p.setAntiAlias(true);// 設(shè)置畫(huà)筆的鋸齒效果  
    
  62.     canvas.drawText("畫(huà)圓角矩形:", 10, 260, p);  
    
  63.     RectF oval3 = new RectF(80, 260, 200, 300);// 設(shè)置個(gè)新的長(zhǎng)方形  
    
  64.     canvas.drawRoundRect(oval3, 20, 15, p);//第二個(gè)參數(shù)是x半徑评也,第三個(gè)參數(shù)是y半徑    
    
  65.     //畫(huà)貝塞爾曲線  
    
  66.     canvas.drawText("畫(huà)貝塞爾曲線:", 10, 310, p);  
    
  67.     p.reset();  
    
  68.     p.setStyle(Paint.Style.STROKE);  
    
  69.     p.setColor(Color.GREEN);  
    
  70.     Path path2=new Path();  
    
  71.     path2.moveTo(100, 320);//設(shè)置Path的起點(diǎn)  
    
  72.     path2.quadTo(150, 310, 170, 400); //設(shè)置貝塞爾曲線的控制點(diǎn)坐標(biāo)和終點(diǎn)坐標(biāo)  
    
  73.     canvas.drawPath(path2, p);//畫(huà)出貝塞爾曲線    
    
  74.     //畫(huà)點(diǎn)  
    
  75.     p.setStyle(Paint.Style.FILL);  
    
  76.     canvas.drawText("畫(huà)點(diǎn):", 10, 390, p);  
    
  77.     canvas.drawPoint(60, 390, p);//畫(huà)一個(gè)點(diǎn)  
    
  78.     canvas.drawPoints(new float[]{60,400,65,400,70,400}, p);//畫(huà)多個(gè)點(diǎn)   
    
  79.     //畫(huà)圖片
    
  80.     Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);  
    
  81.     canvas.drawBitmap(bitmap, 250,360, p);  
    
除了以上繪制的方法,Canvas還提供了如下方法進(jìn)行坐標(biāo)變換:
  • rotate(float degrees,float px,float py):對(duì)Canvas執(zhí)行旋轉(zhuǎn)變換灭返。
  • scale(float sx,float sy,float px,float py):對(duì)Canvas執(zhí)行縮放變換盗迟。
  • skew(float sx,float sy):對(duì)Canvas執(zhí)行傾斜變換。
  • trnslate(float dx,float dy):移動(dòng)Canvas.向右移動(dòng)dx距離(為負(fù)數(shù)相反方向移動(dòng))熙含,向下移動(dòng)dy距離(為負(fù)數(shù)相反方向移動(dòng))罚缕。
Paint 代表了Canvas上的畫(huà)筆、畫(huà)刷怎静、顏料等等邮弹,Paint類(lèi)常用方法:
  • setARGB(int a, int r, int g, int b) // 設(shè)置 Paint對(duì)象顏色,參數(shù)一為alpha透明值
  • setAlpha(int a) // 設(shè)置alpha不透明度消约,范圍為0~255
  • setAntiAlias(boolean aa) // 是否抗鋸齒
  • setColor(int color) // 設(shè)置顏色肠鲫,這里Android內(nèi)部定義的有Color類(lèi)包含了一些常見(jiàn)顏色定義
  • setTextScaleX(float scaleX) // 設(shè)置文本縮放倍數(shù),1.0f為原始
  • setTextSize(float textSize) // 設(shè)置字體大小
  • setUnderlineText(booleanunderlineText) // 設(shè)置下劃線
  • setStyle(Paint.Style style) //設(shè)置填充的風(fēng)格
  • setStrokeLayer(float radius,float dx,float dy,int color) //設(shè)置陰影或粮。
  • setStrokeWidth(float width) //設(shè)置畫(huà)筆的筆觸寬度
學(xué)習(xí)了上面的API知識(shí),我們可以開(kāi)始繪制自己需要的View跟效果了捞高,下面是我模擬飛機(jī)射擊氯材,繪出來(lái)的一個(gè)View。主要還是注意算法的寫(xiě)入硝岗。
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
/**
 * Created by Amin on 2016/12/1. 
*/
public class ImageDragView extends View { 
   SheXian sheXian;
    private float x1 = 500;
    private float y1 = 1000;
    private float ZHIDAN = 50;
    private Bitmap bitmap;
    public final ArrayList<SheXian> balls  = new ArrayList<SheXian>();    float time2 = 0;
    public ImageDragView(Context context) {
        super(context);
        iniData();
    }
    public ImageDragView(Context context, AttributeSet attrs) {
        super(context, attrs);
        iniData(); 
   } 
   public ImageDragView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        iniData();
    } 
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        // 如果觸碰事件不是按下氢哮、移動(dòng)事件
        if (event.getAction() != MotionEvent.ACTION_DOWN                && event.getAction() != MotionEvent.ACTION_MOVE) {
            return false;
        }
        if (Math.abs(x1 - event.getX()) < 100 && Math.abs(y1 - event.getY()) < 100) {
            x1 = event.getX();
            y1 = event.getY();
//            if (balls.size() > 100) {
//                balls.clear();
//            }
//            sheXian.setY1(y1);
//            sheXian.setX1(x1);
//            balls.add(sheXian);
        } 
       if (Math.abs(getHeight() / 2 - x1) < 150 && Math.abs(getWidth() / 2 - y1) < 150) { 
           time2 = 0;
        }
        invalidate();
        return true;
    } 
   @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        canvas.drawBitmap(bitmap, x1 - 72, y1 - 72, paint);
        DrawLine(canvas, paint, time2, x1, y1);
        paint.setColor(Color.BLUE);
        canvas.drawCircle(getHeight() / 2, getWidth() / 2, 100, paint);
        paint.setColor(Color.RED);
        paint.setTextSize(40);
        canvas.drawText("補(bǔ)充彈藥", getHeight() / 2 - 70, getWidth() / 2, paint);        drawMyLine(canvas, paint);

        if (true) {
            invalidate();
        }
        time2 = time2 + 20;
        if (time2 >= 7500) {
            time2 = 3750;
            drawMyLine(canvas, paint);
        }
    }
    private void drawMyLine(Canvas canvas, Paint paint) {
        Log.i("mytag", "balls.size()=" + balls.size());
        for (int i = 0; i < 50; i++) {
            DrawLine(canvas, paint, time2 - 150 * i, x1, y1);
        }
    }
//
//    private float X(int i) {
//        Log.i("mytag", "i=" + i);
//        if (balls.size() != 0) {
//            Log.i("mytag", "balls.get(0).getX1()=" + balls.get(0).getX1());
//            return balls.get(balls.size() - 1).getX1();
//
//        } else {
//            Log.i("mytag", "x1=" + x1);
//            return x1;
//        }
//
//    }
//
//    private float Y(int i) {
//
//        if (balls.size() != 0) {
//            Log.i("mytag", "balls.get(0).getX1()=" + balls.get(0).getY1());
//            return balls.get(balls.size() - 1).getY1();
//        } else {
//            return y1;
//        }
//    } 
   private void DrawLine(Canvas canvas, Paint paint, float time, float x2, float y2) {
        if (time > 0) {
            canvas.drawLine(x2 + X3(time * (float) Math.sqrt(2) / 2), y2 + Y3(time * (float) Math.sqrt(2) / 2),
                    x2 + X3(time * (float) Math.sqrt(2) / 2 + ZHIDAN), y2 + Y3(time * (float) Math.sqrt(2) / 2 + ZHIDAN), paint);
            canvas.drawLine(x2 - time * (float) Math.sqrt(2) / 2, y2 - time * (float) Math.sqrt(2) / 2,
                    x2 - time * (float) Math.sqrt(2) / 2 - ZHIDAN, y2 - time * (float) Math.sqrt(2) / 2 - ZHIDAN, paint);
            canvas.drawLine(x2 + time * (float) Math.sqrt(2) / 2, y2 - time * (float) Math.sqrt(2) / 2,
                    x2 + time * (float) Math.sqrt(2) / 2 + ZHIDAN, y2 - time * (float) Math.sqrt(2) / 2 - ZHIDAN, paint);
            canvas.drawLine(x2 - X3(time * (float) Math.sqrt(2) / 2), y2 + Y3(time * (float) Math.sqrt(2) / 2),
                    x2 - X3(time * (float) Math.sqrt(2) / 2 - ZHIDAN), y2 + Y3(time * (float) Math.sqrt(2) / 2 - ZHIDAN), paint);
            canvas.drawLine(x2 - time, y2, x2 - time - ZHIDAN, y2, paint);
            canvas.drawLine(x2, y2 - time, x2, y2 - time - ZHIDAN, paint);
            canvas.drawLine(x2 + time, y2, x2 + time + ZHIDAN, y2, paint);
            // canvas.drawLine(x1, y1 + time, x1, y1 + time + 70, paint);
        } 
   } 
   private float X3(float x) {
        if (x < 300) { 
           return x;
        } else { 
           return 300;
        }
    } 
   private float Y3(float y) {
        if (y < 300) {
            return y;
        } else { 
           return -y + 620;
        } 
   }
    private void iniData() {
        Resources res = getResources();
        bitmap = BitmapFactory.decodeResource(res, R.drawable.feiji2);
        sheXian = new SheXian(); 
   }
}

代碼中我添加的監(jiān)聽(tīng)事件是onTouchEvent,并且判斷了手勢(shì)的滑動(dòng)型檀,排除了非按下跟移動(dòng)事件冗尤。為了實(shí)現(xiàn)拖動(dòng)效果,在拖動(dòng)的范圍必須在飛機(jī)的正負(fù)100PX之內(nèi)。當(dāng)X1 Y1發(fā)生改變時(shí)裂七,界面也開(kāi)始重繪皆看。因?yàn)槲以诶L制方法內(nèi)寫(xiě)入一個(gè)死循環(huán),不停地刷新界面繪制調(diào)用invalidate()方法背零。而子彈的射出腰吟,是循環(huán)繪制的50發(fā)子彈,并寫(xiě)入算法徙瓶,不停的改變x y 的坐標(biāo)毛雇,成規(guī)律型增長(zhǎng)。就實(shí)現(xiàn)了移動(dòng)效果侦镇。在iniData()方法中灵疮,獲取資源圖片,就是飛機(jī)的圖片格式轉(zhuǎn)換為bitmap位圖壳繁。另外就是我直接手機(jī)測(cè)試完成震捣,分辨率為1080*1920的,在代碼中并沒(méi)有進(jìn)行分辨率的適配氮趋,直接用的PX像素單位伍派,不同的手機(jī)運(yùn)行起來(lái)肯定有差異了,注意更改適配剩胁。
完全使用刷新重繪完成的View,所以動(dòng)畫(huà)的效果更改不是那么完善诉植,后面我會(huì)用ObjectAnimator來(lái)介紹自定義View跟自定義的屬性動(dòng)畫(huà)所結(jié)合,更靈活的實(shí)現(xiàn)子彈獨(dú)立化的移動(dòng)昵观。本文就介紹到這里晾腔,不懂的地方和不足之處請(qǐng)留言,謝謝支持啊犬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灼擂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子觉至,更是在濱河造成了極大的恐慌剔应,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件语御,死亡現(xiàn)場(chǎng)離奇詭異峻贮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)应闯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)纤控,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碉纺,你說(shuō)我怎么就攤上這事船万】倘觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵耿导,是天一觀的道長(zhǎng)声怔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)碎节,這世上最難降的妖魔是什么捧搞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狮荔,結(jié)果婚禮上胎撇,老公的妹妹穿的比我還像新娘。我一直安慰自己殖氏,他們只是感情好晚树,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著雅采,像睡著了一般爵憎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婚瓜,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天宝鼓,我揣著相機(jī)與錄音,去河邊找鬼巴刻。 笑死愚铡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胡陪。 我是一名探鬼主播沥寥,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼柠座!你這毒婦竟也來(lái)了邑雅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妈经,失蹤者是張志新(化名)和其女友劉穎淮野,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吹泡,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡录煤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荞胡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡了嚎,死狀恐怖泪漂,靈堂內(nèi)的尸體忽然破棺而出廊营,到底是詐尸還是另有隱情,我是刑警寧澤萝勤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布露筒,位于F島的核電站,受9級(jí)特大地震影響敌卓,放射性物質(zhì)發(fā)生泄漏慎式。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一趟径、第九天 我趴在偏房一處隱蔽的房頂上張望瘪吏。 院中可真熱鬧,春花似錦蜗巧、人聲如沸掌眠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蓝丙。三九已至,卻和暖如春望拖,著一層夾襖步出監(jiān)牢的瞬間渺尘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工说敏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸥跟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓像云,卻偏偏與公主長(zhǎng)得像锌雀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迅诬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 一腋逆、概述 1. 四線格與基線 小時(shí)候,我們?cè)趧傞_(kāi)始學(xué)習(xí)寫(xiě)字母時(shí)侈贷,用的本子是四線格的惩歉,我們必須把字母按照規(guī)則寫(xiě)在四線...
    addapp閱讀 7,610評(píng)論 2 17
  • 前言: 在接觸Android這么長(zhǎng)時(shí)間,看到很多大牛都在和大家分享自己的知識(shí)俏蛮,深有體會(huì)撑蚌,剛好前段時(shí)間寫(xiě)了一個(gè)Dem...
    楊艷偉閱讀 1,251評(píng)論 0 5
  • 系列文章之 Android中自定義View(一)系列文章之 Android中自定義View(二)系列文章之 And...
    YoungerDev閱讀 4,379評(píng)論 3 11
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載 前言 Canvas 本意是畫(huà)布的意思,然而將它理解為繪制工具一...
    cc榮宣閱讀 41,526評(píng)論 1 47
  • 從中產(chǎn)階級(jí)到赤貧亮垫,真是太容易的一件事模软。很多自稱(chēng)財(cái)務(wù)自由的90后,并非大家想象的那樣瀟灑自在饮潦。有多少存款燃异,在這個(gè)善變...
    壞了個(gè)蛋閱讀 685評(píng)論 4 3