日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Canvas之translate、scale、rotate、skew

發(fā)布時間:2024/3/13 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Canvas之translate、scale、rotate、skew 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
id="BAIDU_DUP_fp_iframe" src="https://pos.baidu.com/wh/o.htm?ltr=" style="width: 0px; height: 0px; visibility: hidden; display: none;">
  • 收藏成功 確定 收藏失敗,請重新收藏 確定
  • src="about:block" frameborder="0" allowtransparency="true" style="z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%;background:transparent">
  • 分享資訊 傳PPT/文檔 提問題 寫博客 傳資源 創(chuàng)建項目 創(chuàng)建代碼片
  • 設(shè)置昵稱 編輯自我介紹,讓更多人了解你
    帳號設(shè)置 退出
  • 社區(qū)
    博客
    論壇
    下載
    知識庫
    技術(shù)問答
    極客頭條
    英雄會
    服務(wù)
    JOB
    學院
    CODE
    活動
    CSTO
    C幣兌換
    俱樂部
    CTO俱樂部
    高校俱樂部

Ajian_studio

學問積年而成,而每日不自知!

  • 目錄視圖
  • 摘要視圖
  • 訂閱
<script type="text/javascript">var username = "tianjian4592"; var _blogger = username; var blog_address = "http://blog.csdn.net/tianjian4592"; var static_host = "http://static.blog.csdn.net"; var currentUserName = "";</script> 移動信息安全的漏洞和逆向原理??? 【觀點】世界上最好的語言是什么??? Get IT技能知識庫,50個領(lǐng)域一鍵直達 <script>document.getElementById('location_parent').parentNode.style.height='1px';document.getElementById('location_parent').parentNode.style.width='1px';document.getElementById('location_parent').parentNode.style.position='fixed';document.getElementById('location_parent').parentNode.style.right='10px';document.getElementById('location_parent').parentNode.style.bottom='10px';document.getElementById('location_parent').parentNode.style.zIndex=999;document.getElementById('location_parent').parentNode.style.backgroundColor='transparent';</script> id="iframeu2392861_0" src="http://pos.baidu.com/acrm?sz=300x250&rdid=2392861&dc=2&di=u2392861&dri=0&dis=0&dai=1&ps=1008x1818&coa=at%3D3%26rsi0%3D300%26rsi1%3D250%26pat%3D17%26tn%3DbaiduCustNativeAD_xuanfu%26rss1%3D%2523FFFFFF%26conBW%3D1%26adp%3D1%26ptt%3D0%26titFF%3D%2525E5%2525BE%2525AE%2525E8%2525BD%2525AF%2525E9%25259B%252585%2525E9%2525BB%252591%26titFS%3D14%26rss2%3D%2523000000%26titSU%3D0&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1478326006940&ti=Canvas%E4%B9%8Btranslate%E3%80%81scale%E3%80%81rotate%E3%80%81skew%E6%96%B9%E6%B3%95%E8%AE%B2%E8%A7%A3%EF%BC%81%20-%20Ajian_studio%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91&ari=2&dbv=2&drs=3&pcs=1829x1019&pss=1829x19885&cfv=0&cpl=4&chi=3&cce=true&cec=UTF-8&tlm=1478326006&rw=1019&ltu=http%3A%2F%2Fblog.csdn.net%2Ftianjian4592%2Farticle%2Fdetails%2F45234419&ecd=1&psr=1920x1080&par=1846x1080&pis=-1x-1&ccd=24&cja=false&cmi=6&col=zh-CN&cdo=-1&tcn=1478326007&qn=846792b09ec303f7&tt=1478326006861.94.97.114" width="300" height="250" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0; vertical-align:bottom;margin:0;" allowtransparency="true"> 關(guān)閉 <script type="text/javascript">(window['cproStyleApi'] = window['cproStyleApi'] || {})['u2392861']={at:'3',rsi0:'300',rsi1:'250',pat:'17',tn:'baiduCustNativeAD_xuanfu',rss1:'#FFFFFF',conBW:'1',adp:'1',ptt:'0',titFF:'%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91',titFS:'14',rss2:'#000000',titSU:'0'};/*服務(wù)器頻道首頁置頂Banner960*90,創(chuàng)建于2014-7-3*/(window.cproArray = window.cproArray || []).push({id:'u2392861'});</script> <script src="http://cpro.baidustatic.com/cpro/ui/f.js" type="text/javascript"></script> href="http://static.blog.csdn.net/css/comment1.css" type="text/css" rel="stylesheet" /> href="http://static.blog.csdn.net/css/style1.css" type="text/css" rel="stylesheet" /><script language="JavaScript" type="text/javascript" src="http://download.csdn.net/js/jquery.cookie.js"></script><script type="text/javascript" src="http://c.csdnimg.cn/rabbit/search-service/main.js"></script> rel="stylesheet" href="http://static.blog.csdn.net/public/res-min/markdown_views.css?v=1.0" /> rel="stylesheet" href="http://static.blog.csdn.net/css/category.css?v=1.0" /><script type="text/javascript" src="http://static.blog.csdn.net/public/res/bower-libs/MathJax/MathJax.js?config=TeX-AMS_HTML"></script><script type="text/javascript" src="http://static.blog.csdn.net/scripts/web-storage-cache.min.js"></script><script type="text/javascript" src="http://static.blog.csdn.net/scripts/replace.min.js"></script> <script type="text/ecmascript">window.quickReplyflag = true; var isBole = false;</script>

[置頂] Canvas之translate、scale、rotate、skew方法講解!

標簽: Canvasandroid畫布canvas.translatecanvas.scalecanvas.rotate 8987人閱讀 評論(11) 收藏 舉報 本文章已收錄于: .embody{padding:10px 10px 10px;margin:0 -20px;border-bottom:solid 1px #ededed; }.embody_b{margin:0 ;padding:10px 0;}.embody .embody_t,.embody .embody_c{display: inline-block;margin-right:10px;}.embody_t{font-size: 12px;color:#999;}.embody_c{font-size: 12px;}.embody_c img,.embody_c em{display: inline-block;vertical-align: middle; }.embody_c img{ width:30px;height:30px;}.embody_c em{margin: 0 20px 0 10px;color:#333;font-style: normal;} <script type="text/javascript">$(function () { try { var lib = eval("("+$("#lib").attr("value")+")"); var html = ""; if (lib.err == 0) { $.each(lib.data, function (i) { var obj = lib.data[i]; //html += ' ' + obj.name + "??"; html += ' 分類: android動效篇(12) 作者同類文章 X
    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>


    尊重原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明: FROM? GA_studio? ?http://blog.csdn.net/tianjian4592??


    前面說Canvas大致可以分為三類:

    1. save、restore 等與層的保存和回滾相關(guān)的方法;

    2. scale、rotate、clipXXX 等對畫布進行操作的方法;

    3. drawXXX 等一系列繪畫相關(guān)的方法;


    前面主要講了drawBitmap方法,并舉了一個星球浮動的栗子,在那個例子中,星球有大有小,需要移動,有時候可能需求上還需要旋轉(zhuǎn)或錯切,有了這些需求,我們就需要使用到與Canvas相關(guān)的translate、scale、rotate、skew這幾個方法,平移、縮放、旋轉(zhuǎn)、錯切,這四個詞聽起來是如此的熟悉,我們在做一些基本動畫的時候經(jīng)常會與這幾個詞打交道,現(xiàn)在我們一個個看下當把這幾個家伙和Canvas(畫布)結(jié)合能產(chǎn)生什么效果;

    當然在看之前得先明確兩個基本概念:

    1.Canvas 的左上角是(0,0);

    2.基于左上角往右 X 為正,往下 Y 為正,反之為負;


    一、canvas.translate() - 畫布的平移:

    首先咱們在畫布上畫一個400 X 400 紅色的矩形

    [html] view plain copy print ?
  • canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);

    此時整個畫布的左上角出現(xiàn)了一個紅色的矩形(為了更清楚,藍色打個底)該矩形大小為400 X 400 ,效果如下:


    接下來我們canvas.translate( )玩玩

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.translate(100,?100);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.translate(100, 100);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);}
    看下效果:

    此時可以看到,雖然是繪制同樣的矩形,但矩形在畫布上的位置已經(jīng)向右和向下各移動了100px;

    既然如此,這個時候如果我們再將canvas 平移(translate)(100,100),再繪制一個同樣的矩形會出現(xiàn)什么情況呢?會與之前的矩形重疊嗎?咱們拭目以待:

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.translate(100,?100);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ????canvas.translate(100,?100);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.translate(100, 100);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);canvas.translate(100, 100);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);}


    從效果上看,兩次translate 進行了疊加,繪制第二個矩形的時候畫布已經(jīng)偏移了(200,200);

    好了,了解到這里,咱們利用canvas.translate( )一起來做個小栗子,繪制一個生活中比較常用的刻度尺;

    咱們先從網(wǎng)上找個用于參考的刻度尺圖片:

    從圖上看,刻度尺的元素有:外框、刻度線(不同的數(shù)值刻度線長短不一)、數(shù)字

    所以我們所要做的就是對上面的元素在onDraw里分別繪制:

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????//?繪制外框??
  • ????drawOuter(canvas);??
  • ????//?繪制刻度線??
  • ????drawLines(canvas);??
  • ????//?繪制數(shù)字??
  • ????drawNumbers(canvas);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 繪制外框drawOuter(canvas);// 繪制刻度線drawLines(canvas);// 繪制數(shù)字drawNumbers(canvas);} 咱們先簡單分析一下,刻度尺有個外框,外框距離左右都有一定的邊距,第一根和最后一根刻度線距離邊框也有一定的邊距,其余刻度線之間距離相同,另外一些特殊的刻度線長短不一;

    有了上面的分析,咱們一個一個來,先繪制外框,外框也就是一個矩形,只需要確定邊框的位置和大小,然后使用canvas.drawRect( )繪制即可:

    咱們先定義幾個需要的數(shù)據(jù),為了屏幕適配,數(shù)據(jù)均為dp:

    [html] view plain copy print ?
  • //?刻度尺高度??
  • private?static?final?int?DIVIDING_RULE_HEIGHT?=?70;??
  • //?距離左右間??
  • private?static?final?int?DIVIDING_RULE_MARGIN_LEFT_RIGHT?=?10;??
  • ??
  • //?第一條線距離邊框距離??
  • private?static?final?int?FIRST_LINE_MARGIN?=?5;??
  • //?打算繪制的厘米數(shù)??
  • private?static?final?int?DEFAULT_COUNT?=?9;??
  • // 刻度尺高度private static final int DIVIDING_RULE_HEIGHT = 70;// 距離左右間private static final int DIVIDING_RULE_MARGIN_LEFT_RIGHT = 10;// 第一條線距離邊框距離private static final int FIRST_LINE_MARGIN = 5;// 打算繪制的厘米數(shù)private static final int DEFAULT_COUNT = 9; 然后將以上數(shù)據(jù)轉(zhuǎn)為對應(yīng)像素值:

    [html] view plain copy print ?
  • private?void?initData()?{??
  • ????mDividRuleHeight?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,??
  • ????????????DIVIDING_RULE_HEIGHT,?mResources.getDisplayMetrics());??
  • ????mHalfRuleHeight?=?mDividRuleHeight?/?2;??
  • ??
  • ????mDividRuleLeftMargin?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,??
  • ????????????DIVIDING_RULE_MARGIN_LEFT_RIGHT,?mResources.getDisplayMetrics());??
  • ????mFirstLineMargin?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,??
  • ????????????FIRST_LINE_MARGIN,?mResources.getDisplayMetrics());??
  • ??
  • }??
  • private void initData() {mDividRuleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,DIVIDING_RULE_HEIGHT, mResources.getDisplayMetrics());mHalfRuleHeight = mDividRuleHeight / 2;mDividRuleLeftMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,DIVIDING_RULE_MARGIN_LEFT_RIGHT, mResources.getDisplayMetrics());mFirstLineMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,FIRST_LINE_MARGIN, mResources.getDisplayMetrics());} 有了以上數(shù)據(jù),則可以確定外邊框的Rect為:

    [html] view plain copy print ?
  • mOutRect?=?new?Rect(mDividRuleLeftMargin,?top,?mTotalWidth?-?mDividRuleLeftMargin,??
  • ????????????????mRuleBottom);??
  • mOutRect = new Rect(mDividRuleLeftMargin, top, mTotalWidth - mDividRuleLeftMargin,mRuleBottom);

    接下來看刻度線的繪制,根據(jù)厘米可以計算出中間的格數(shù),根據(jù)厘米占用屏幕寬度和所占格數(shù)可以計算出每一格所占屏幕寬度:

    [html] view plain copy print ?
  • mLineInterval?=?(mTotalWidth?-?2?*?mDividRuleLeftMargin?-?2?*?mFirstLineMargin)??
  • ????????????????/?(DEFAULT_COUNT?*?10?-?1);??
  • mLineInterval = (mTotalWidth - 2 * mDividRuleLeftMargin - 2 * mFirstLineMargin)/ (DEFAULT_COUNT * 10 - 1);

    有了每一格所占寬度,我們只需要在繪制刻度線的時候不斷將畫布右移對應(yīng)寬度即可:

    [html] view plain copy print ?
  • /**??
  • ?*?繪制刻度線??
  • ?*?@param?canvas??
  • ?*/??
  • private?void?drawLines(Canvas?canvas)?{??
  • ????canvas.save();??
  • ????canvas.translate(mLineStartX,?0);??
  • ????int?top?=?mMaxLineTop;??
  • ????for?(int?i?=?0;?i?<=?DEFAULT_COUNT?*?10;?i++)?{??
  • ????????if?(i?%?10?==?0)?{??
  • ????????????top?=?mMaxLineTop;??
  • ????????}?else?if?(i?%?5?==?0)?{??
  • ????????????top?=?mMiddleLineTop;??
  • ????????}?else?{??
  • ????????????top?=?mMinLineTop;??
  • ????????}??
  • ??
  • ????????canvas.drawLine(0,?mRuleBottom,?0,?top,?mLinePaint);??
  • ????????canvas.translate(mLineInterval,?0);??
  • ??
  • ????}??
  • ????canvas.restore();??
  • ??
  • }??
  • /*** 繪制刻度線* @param canvas*/private void drawLines(Canvas canvas) {canvas.save();canvas.translate(mLineStartX, 0);int top = mMaxLineTop;for (int i = 0; i <= DEFAULT_COUNT * 10; i++) {if (i % 10 == 0) {top = mMaxLineTop;} else if (i % 5 == 0) {top = mMiddleLineTop;} else {top = mMinLineTop;}canvas.drawLine(0, mRuleBottom, 0, top, mLinePaint);canvas.translate(mLineInterval, 0);}canvas.restore();} 由于刻度尺上分三種長短的刻度線,我們也做對應(yīng)處理,10的整數(shù)倍的刻度線最長,5的整數(shù)倍的刻度線中等長度,其余較短;

    此時繪制出的刻度尺效果為:


    此時刻度尺的基本樣子就出來了,對應(yīng)文字大家有興趣可以自己加上;

    俗話說,條條大路通羅馬,我們除了使用canvas.translate ,還能不能使用別的方式進行實現(xiàn)呢,答案當然是可以,比如在繪制的時候根據(jù)for循環(huán)里的 i 值也可以直接計算出每一根刻度線的位置,然后直接進行繪制,相比之下,這兩種方式的優(yōu)劣大家也可以自行比較一下,好了,canvas.translate() 就說這么多;


    二、canvas.scale( ) - 畫布的縮放:

    關(guān)于scale,Android 提供了以下兩個接口:

    [html] view plain copy print ?
  • /**??
  • ?*?Preconcat?the?current?matrix?with?the?specified?scale.??
  • ?*??
  • ?*?@param?sx?The?amount?to?scale?in?X??
  • ?*?@param?sy?The?amount?to?scale?in?Y??
  • ?*/??
  • public?native?void?scale(float?sx,?float?sy);??
  • ??
  • /**??
  • ?*?Preconcat?the?current?matrix?with?the?specified?scale.??
  • ?*??
  • ?*?@param?sx?The?amount?to?scale?in?X??
  • ?*?@param?sy?The?amount?to?scale?in?Y??
  • ?*?@param?px?The?x-coord?for?the?pivot?point?(unchanged?by?the?scale)??
  • ?*?@param?py?The?y-coord?for?the?pivot?point?(unchanged?by?the?scale)??
  • ?*/??
  • public?final?void?scale(float?sx,?float?sy,?float?px,?float?py)?{??
  • ????translate(px,?py);??
  • ????scale(sx,?sy);??
  • ????translate(-px,?-py);??
  • }??
  • /*** Preconcat the current matrix with the specified scale.** @param sx The amount to scale in X* @param sy The amount to scale in Y*/public native void scale(float sx, float sy);/*** Preconcat the current matrix with the specified scale.** @param sx The amount to scale in X* @param sy The amount to scale in Y* @param px The x-coord for the pivot point (unchanged by the scale)* @param py The y-coord for the pivot point (unchanged by the scale)*/public final void scale(float sx, float sy, float px, float py) {translate(px, py);scale(sx, sy);translate(-px, -py);} 我們先看下scale(float sx , float sy),我們還是以上面的正方形作為栗子,調(diào)用canvas.scale(float sx , float sy)之后看下效果;

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ????canvas.scale(0.5f,?0.5f);??
  • ????mPaint.setColor(Color.YELLOW);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);canvas.scale(0.5f, 0.5f);mPaint.setColor(Color.YELLOW);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);} 我們將畫布在x,y方向上均縮放為 0.5 倍,使用默認基準點(原點 0,0),效果如下:


    效果就相當于用個釘子釘在(0,0)處,然后把矩形的x,y縮放為一半,我們再來看看第二個接口scale(float sx , float sy, float px,float py):

    前兩個參數(shù)為將畫布在x、y方向上縮放的倍數(shù),而px和py 分別為縮放的基準點,從源碼上可以非常清楚的看出和scale(float sx , float sy)的差別:

    [html] view plain copy print ?
  • translate(px,?py);??
  • scale(sx,?sy);??
  • translate(-px,?-py);??
  • translate(px, py); scale(sx, sy); translate(-px, -py); 即先將畫布平移px,py,然后scale,scale結(jié)束之后再將畫布平移回原基準點;

    我們再在之前的基礎(chǔ)上繪制一個同樣的矩形,x , y 均縮放為 0.5 倍,縮放中心為矩形的中心:

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ??
  • ????//?保存畫布狀態(tài)??
  • ????canvas.save();??
  • ????canvas.scale(0.5f,?0.5f);??
  • ????mPaint.setColor(Color.YELLOW);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ????//?畫布狀態(tài)回滾??
  • ????canvas.restore();??
  • ??
  • ????canvas.scale(0.5f,?0.5f,?200,?200);??
  • ????mPaint.setColor(Color.BLACK);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);// 保存畫布狀態(tài)canvas.save();canvas.scale(0.5f, 0.5f);mPaint.setColor(Color.YELLOW);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);// 畫布狀態(tài)回滾canvas.restore();canvas.scale(0.5f, 0.5f, 200, 200);mPaint.setColor(Color.BLACK);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);}

    一起來看下效果:


    效果就相當于用個釘子釘在矩形的中心,然后進行縮放;

    根據(jù)上面android 的實現(xiàn),我們其實可以使用以下代碼實現(xiàn)同樣的效果:

    [html] view plain copy print ?
  • //?先將畫布平移到矩形的中心??
  • canvas.translate(200,?200);??
  • //?將畫布進行縮放??
  • canvas.scale(0.5f,?0.5f);??
  • //?將畫布移回原基準點??
  • canvas.translate(-200,?-200);??
  • mPaint.setColor(Color.BLACK);??
  • canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • // 先將畫布平移到矩形的中心canvas.translate(200, 200);// 將畫布進行縮放canvas.scale(0.5f, 0.5f);// 將畫布移回原基準點canvas.translate(-200, -200);mPaint.setColor(Color.BLACK);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);

    到此為止,我們也就了解了對畫布的縮放,基于canvas.scale(),我們一起完成一個小例子:


    上面是網(wǎng)絡(luò)上找的一張讓人產(chǎn)生視覺誤差的靜態(tài)圖,我們模擬繪制出上面的效果;

    思路非常的簡單:

    1. 繪制一個和屏幕等寬的正方形;

    2. 將畫布以正方形中心為基準點進行縮放;

    3. 在縮放的過程中繪制原正方形;

    注:每次繪制都得使用canvas.save() ?和 canvas.restore()進行畫布的鎖定和回滾,以免除對后面繪制的影響(后面會單獨講)

    先初始化畫筆,注意此時畫筆需要設(shè)置成空心:

    [html] view plain copy print ?
  • /**??
  • ?*?初始化畫筆??
  • ?*/??
  • private?void?initPaint()?{??
  • ????mPaint?=?new?Paint(Paint.ANTI_ALIAS_FLAG);??
  • ????//?將畫筆設(shè)置為空心??
  • ????mPaint.setStyle(Style.STROKE);??
  • ????//?設(shè)置畫筆顏色??
  • ????mPaint.setColor(Color.BLACK);??
  • ????//?設(shè)置畫筆寬度??
  • ????mPaint.setStrokeWidth(mLineWidth);??
  • }??
  • /*** 初始化畫筆*/private void initPaint() {mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);// 將畫筆設(shè)置為空心mPaint.setStyle(Style.STROKE);// 設(shè)置畫筆顏色mPaint.setColor(Color.BLACK);// 設(shè)置畫筆寬度mPaint.setStrokeWidth(mLineWidth);} 然后循環(huán)的將畫布縮放的同時繪制原正方形:

    [html] view plain copy print ?
  • /**??
  • ?*?繪制正方形??
  • ?*???
  • ?*?@param?canvas??
  • ?*/??
  • private?void?drawSquare(Canvas?canvas)?{??
  • ????for?(int?i?=?0;?i?<?TOTAL_SQUARE_COUNT;?i++)?{??
  • ????????//?保存畫布??
  • ????????canvas.save();??
  • ????????float?fraction?=?(float)?i?/?TOTAL_SQUARE_COUNT;??
  • ????????//?將畫布以正方形中心進行縮放??
  • ????????canvas.scale(fraction,?fraction,?mHalfWidth,?mHalfHeight);??
  • ????????canvas.drawRect(mSquareRect,?mPaint);??
  • ????????//?畫布回滾??
  • ????????canvas.restore();??
  • ????}??
  • }??
  • /*** 繪制正方形* * @param canvas*/private void drawSquare(Canvas canvas) {for (int i = 0; i < TOTAL_SQUARE_COUNT; i++) {// 保存畫布canvas.save();float fraction = (float) i / TOTAL_SQUARE_COUNT;// 將畫布以正方形中心進行縮放canvas.scale(fraction, fraction, mHalfWidth, mHalfHeight);canvas.drawRect(mSquareRect, mPaint);// 畫布回滾canvas.restore();}} 一起來看下繪制的效果:

    其實最終效果和網(wǎng)上找的還是有點小差別的,由于畫布的縮放,越小的時候畫筆寬度越細,而原圖是所有的都一樣寬度,但似乎畫筆寬度縮放之后效果更佳,哈哈 ... ...?


    三、canvas.rotate( ) - 畫布的旋轉(zhuǎn):

    canvas.rotate( )和canvas.scale()可以類比起來看,如果理解了canvas.scale( ),那么canvas.rotate( )將會非常簡單實用;

    簡單來講,canvas.rotate( )即是將畫布進行旋轉(zhuǎn),和canvas.scale( )類似的是,它也有兩個可以使用的方法:

    [html] view plain copy print ?
  • /**??
  • ?*?Preconcat?the?current?matrix?with?the?specified?rotation.??
  • ?*??
  • ?*?@param?degrees?The?amount?to?rotate,?in?degrees??
  • ?*/??
  • public?native?void?rotate(float?degrees);??
  • ??
  • /**??
  • ?*?Preconcat?the?current?matrix?with?the?specified?rotation.??
  • ?*??
  • ?*?@param?degrees?The?amount?to?rotate,?in?degrees??
  • ?*?@param?px?The?x-coord?for?the?pivot?point?(unchanged?by?the?rotation)??
  • ?*?@param?py?The?y-coord?for?the?pivot?point?(unchanged?by?the?rotation)??
  • ?*/??
  • public?final?void?rotate(float?degrees,?float?px,?float?py)?{??
  • ????translate(px,?py);??
  • ????rotate(degrees);??
  • ????translate(-px,?-py);??
  • }??
  • /*** Preconcat the current matrix with the specified rotation.** @param degrees The amount to rotate, in degrees*/public native void rotate(float degrees);/*** Preconcat the current matrix with the specified rotation.** @param degrees The amount to rotate, in degrees* @param px The x-coord for the pivot point (unchanged by the rotation)* @param py The y-coord for the pivot point (unchanged by the rotation)*/public final void rotate(float degrees, float px, float py) {translate(px, py);rotate(degrees);translate(-px, -py);}

    兩個方法的區(qū)別也是在于基準點的選取,默認是以原點作為基準點,另一個則是以傳入的x,y 作為基準點,是不是和scale 一模一樣,咱們一起來rotate一下:

    咱們先轉(zhuǎn)轉(zhuǎn)左上角的矩形,轉(zhuǎn)多少度呢?先來個90度玩玩吧;

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ????mPaint.setColor(Color.YELLOW);??
  • ????canvas.rotate(90);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);mPaint.setColor(Color.YELLOW);canvas.rotate(90);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);} 我們的預(yù)期是屏幕上有個旋轉(zhuǎn)了的騷黃色矩形,一起來看看;


    擦,黃色的矩形呢?

    由于基準點是原點,我們直接旋轉(zhuǎn)了90 度,所以已經(jīng)將矩形旋轉(zhuǎn)出屏幕,當然看不到了,我們將角度調(diào)小一點,改為45 度:

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ????mPaint.setColor(Color.YELLOW);??
  • ????canvas.rotate(45);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);mPaint.setColor(Color.YELLOW);canvas.rotate(45);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);}

    此時我們可以可以清楚的看到黃色的矩形是紅色矩形繞原點(0,0)旋轉(zhuǎn)45度之后的結(jié)果;


    我們再將旋轉(zhuǎn)基準點改為矩形中心看看:

    [html] view plain copy print ?
  • canvas.rotate(45,200,200);??
  • canvas.rotate(45,200,200);

    可以看到現(xiàn)在黃色矩形是紅色矩形繞著中心旋轉(zhuǎn)后的結(jié)果:


    到這里,我們已經(jīng)了解了canvas.rotate(float degrees)和 canvas.rotate(float degrees,float px , float py)的使用,同樣也應(yīng)該清楚后者的實現(xiàn)如下:

    [html] view plain copy print ?
  • translate(px,?py);??
  • rotate(degrees);??
  • translate(-px,?-py);??
  • translate(px, py); rotate(degrees); translate(-px, -py);

    好了,我們再利用canvas.rotate()完成個鬧鐘表盤的小例子:

    鬧鐘表盤其實和刻度尺類似,只是一個是在一條直線上繪制,一個是在一個圓周上繪制,說到底都是確定一個位置繪制刻度線;

    既然是圓周,最簡單的方式莫過于在鬧鐘的12點鐘處劃線,通過canvas的旋轉(zhuǎn)繪制到對應(yīng)圓周處,我們一起實現(xiàn)一下:

    整個圓周是360 度,每隔 30 度為一個整時間刻度,整刻度與刻度之間有四個短刻度,劃分出5個小段,每個段為6度,有了這些分析,我們則可以采用如下代碼進行繪制:

    [html] view plain copy print ?
  • /**??
  • ?*?繪制刻度??
  • ?*???
  • ?*?@param?canvas??
  • ?*/??
  • private?void?drawLines(Canvas?canvas)?{??
  • ????for?(int?i?=?0;?i?<=?360;?i++)?{??
  • ????????if?(i?%?30?==?0)?{??
  • ????????????mLineBottom?=?mLineTop?+?mLongLineHeight;??
  • ????????????mLinePaint.setStrokeWidth(mLineWidth);??
  • ????????}?else?{??
  • ????????????mLineBottom?=?mLineTop?+?mShortLineHeight;??
  • ????????????mLinePaint.setStrokeWidth(mHalfLineWidth);??
  • ????????}??
  • ??
  • ????????if?(i?%?6?==?0)?{??
  • ????????????canvas.save();??
  • ????????????canvas.rotate(i,?mHalfWidth,?mHalfHeight);??
  • ????????????canvas.drawLine(mLineLeft,?mLineTop,?mLineLeft,?mLineBottom,?mLinePaint);??
  • ????????????canvas.restore();??
  • ????????}??
  • ????}??
  • }??
  • /*** 繪制刻度* * @param canvas*/private void drawLines(Canvas canvas) {for (int i = 0; i <= 360; i++) {if (i % 30 == 0) {mLineBottom = mLineTop + mLongLineHeight;mLinePaint.setStrokeWidth(mLineWidth);} else {mLineBottom = mLineTop + mShortLineHeight;mLinePaint.setStrokeWidth(mHalfLineWidth);}if (i % 6 == 0) {canvas.save();canvas.rotate(i, mHalfWidth, mHalfHeight);canvas.drawLine(mLineLeft, mLineTop, mLineLeft, mLineBottom, mLinePaint);canvas.restore();}}}

    此時效果如下:


    整體代碼如下:

    [html] view plain copy print ?
  • /**??
  • ?*?鬧鐘表盤??
  • ?*???
  • ?*?@author?AJian??
  • ?*/??
  • public?class?RotateClockView?extends?View?{??
  • ??
  • ????private?static?final?int?LONG_LINE_HEIGHT?=?35;??
  • ????private?static?final?int?SHORT_LINE_HEIGHT?=?25;??
  • ????private?Paint?mCirclePaint,?mLinePaint;??
  • ????private?DrawFilter?mDrawFilter;??
  • ????private?int?mHalfWidth,?mHalfHeight;??
  • ??
  • ????//?圓環(huán)線寬度??
  • ????private?int?mCircleLineWidth,?mHalfCircleLineWidth;??
  • ????//?直線刻度線寬度??
  • ????private?int?mLineWidth,?mHalfLineWidth;??
  • ????//?長線長度??
  • ????private?int?mLongLineHeight;??
  • ????//?短線長度??
  • ????private?int?mShortLineHeight;??
  • ????//?刻度線的左、上位置??
  • ????private?int?mLineLeft,?mLineTop;??
  • ??
  • ????//?刻度線的下邊位置??
  • ????private?int?mLineBottom;??
  • ????//?用于控制刻度線位置??
  • ????private?int?mFixLineHeight;??
  • ??
  • ????public?RotateClockView(Context?context)?{??
  • ????????super(context);??
  • ????????mDrawFilter?=?new?PaintFlagsDrawFilter(0,?Paint.ANTI_ALIAS_FLAG??
  • ????????????????|?Paint.FILTER_BITMAP_FLAG);??
  • ??
  • ????????mCircleLineWidth?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,?8,??
  • ????????????????getResources().getDisplayMetrics());??
  • ????????mHalfCircleLineWidth?=?mCircleLineWidth;??
  • ????????mLineWidth?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,?4,??
  • ????????????????getResources().getDisplayMetrics());??
  • ????????mHalfLineWidth?=?mLineWidth?/?2;??
  • ??
  • ????????mFixLineHeight?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,?4,??
  • ????????????????getResources().getDisplayMetrics());??
  • ??
  • ????????mLongLineHeight?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,??
  • ????????????????LONG_LINE_HEIGHT,??
  • ????????????????getResources().getDisplayMetrics());??
  • ????????mShortLineHeight?=?(int)?TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,??
  • ????????????????SHORT_LINE_HEIGHT,??
  • ????????????????getResources().getDisplayMetrics());??
  • ????????initPaint();??
  • ????}??
  • ??
  • ????private?void?initPaint()?{??
  • ????????mCirclePaint?=?new?Paint(Paint.ANTI_ALIAS_FLAG);??
  • ????????mCirclePaint.setColor(Color.RED);??
  • ????????//?將畫筆設(shè)置為空心??
  • ????????mCirclePaint.setStyle(Style.STROKE);??
  • ????????//?設(shè)置畫筆寬度??
  • ????????mCirclePaint.setStrokeWidth(mCircleLineWidth);??
  • ??
  • ????????mLinePaint?=?new?Paint(Paint.ANTI_ALIAS_FLAG);??
  • ????????mLinePaint.setColor(Color.RED);??
  • ????????mLinePaint.setStyle(Style.FILL_AND_STROKE);??
  • ????????//?設(shè)置畫筆寬度??
  • ????????mLinePaint.setStrokeWidth(mLineWidth);??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onMeasure(int?widthMeasureSpec,?int?heightMeasureSpec)?{??
  • ????????super.onMeasure(widthMeasureSpec,?heightMeasureSpec);??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onDraw(Canvas?canvas)?{??
  • ????????canvas.setDrawFilter(mDrawFilter);??
  • ????????super.onDraw(canvas);??
  • ????????//?繪制表盤??
  • ????????drawCircle(canvas);??
  • ????????//?繪制刻度??
  • ????????drawLines(canvas);??
  • ????}??
  • ??
  • ????/**??
  • ?????*?繪制刻度??
  • ?????*???
  • ?????*?@param?canvas??
  • ?????*/??
  • ????private?void?drawLines(Canvas?canvas)?{??
  • ????????for?(int?i?=?0;?i?<=?360;?i++)?{??
  • ????????????if?(i?%?30?==?0)?{??
  • ????????????????mLineBottom?=?mLineTop?+?mLongLineHeight;??
  • ????????????????mLinePaint.setStrokeWidth(mLineWidth);??
  • ????????????}?else?{??
  • ????????????????mLineBottom?=?mLineTop?+?mShortLineHeight;??
  • ????????????????mLinePaint.setStrokeWidth(mHalfLineWidth);??
  • ????????????}??
  • ??
  • ????????????if?(i?%?6?==?0)?{??
  • ????????????????canvas.save();??
  • ????????????????canvas.rotate(i,?mHalfWidth,?mHalfHeight);??
  • ????????????????canvas.drawLine(mLineLeft,?mLineTop,?mLineLeft,?mLineBottom,?mLinePaint);??
  • ????????????????canvas.restore();??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????/**??
  • ?????*?繪制表盤??
  • ?????*???
  • ?????*?@param?canvas??
  • ?????*/??
  • ????private?void?drawCircle(Canvas?canvas)?{??
  • ????????canvas.drawCircle(mHalfWidth,?mHalfHeight,?mHalfWidth?-?mHalfCircleLineWidth,?mCirclePaint);??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onSizeChanged(int?w,?int?h,?int?oldw,?int?oldh)?{??
  • ????????super.onSizeChanged(w,?h,?oldw,?oldh);??
  • ????????mHalfWidth?=?w?/?2;??
  • ????????mHalfHeight?=?h?/?2;??
  • ??
  • ????????mLineLeft?=?mHalfWidth?-?mHalfLineWidth;??
  • ????????mLineTop?=?mHalfHeight?-?mHalfWidth?+?mFixLineHeight;??
  • ????}??
  • }??
  • /*** 鬧鐘表盤* * @author AJian*/ public class RotateClockView extends View {private static final int LONG_LINE_HEIGHT = 35;private static final int SHORT_LINE_HEIGHT = 25;private Paint mCirclePaint, mLinePaint;private DrawFilter mDrawFilter;private int mHalfWidth, mHalfHeight;// 圓環(huán)線寬度private int mCircleLineWidth, mHalfCircleLineWidth;// 直線刻度線寬度private int mLineWidth, mHalfLineWidth;// 長線長度private int mLongLineHeight;// 短線長度private int mShortLineHeight;// 刻度線的左、上位置private int mLineLeft, mLineTop;// 刻度線的下邊位置private int mLineBottom;// 用于控制刻度線位置private int mFixLineHeight;public RotateClockView(Context context) {super(context);mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG| Paint.FILTER_BITMAP_FLAG);mCircleLineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,getResources().getDisplayMetrics());mHalfCircleLineWidth = mCircleLineWidth;mLineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4,getResources().getDisplayMetrics());mHalfLineWidth = mLineWidth / 2;mFixLineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4,getResources().getDisplayMetrics());mLongLineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,LONG_LINE_HEIGHT,getResources().getDisplayMetrics());mShortLineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,SHORT_LINE_HEIGHT,getResources().getDisplayMetrics());initPaint();}private void initPaint() {mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);mCirclePaint.setColor(Color.RED);// 將畫筆設(shè)置為空心mCirclePaint.setStyle(Style.STROKE);// 設(shè)置畫筆寬度mCirclePaint.setStrokeWidth(mCircleLineWidth);mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);mLinePaint.setColor(Color.RED);mLinePaint.setStyle(Style.FILL_AND_STROKE);// 設(shè)置畫筆寬度mLinePaint.setStrokeWidth(mLineWidth);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onDraw(Canvas canvas) {canvas.setDrawFilter(mDrawFilter);super.onDraw(canvas);// 繪制表盤drawCircle(canvas);// 繪制刻度drawLines(canvas);}/*** 繪制刻度* * @param canvas*/private void drawLines(Canvas canvas) {for (int i = 0; i <= 360; i++) {if (i % 30 == 0) {mLineBottom = mLineTop + mLongLineHeight;mLinePaint.setStrokeWidth(mLineWidth);} else {mLineBottom = mLineTop + mShortLineHeight;mLinePaint.setStrokeWidth(mHalfLineWidth);}if (i % 6 == 0) {canvas.save();canvas.rotate(i, mHalfWidth, mHalfHeight);canvas.drawLine(mLineLeft, mLineTop, mLineLeft, mLineBottom, mLinePaint);canvas.restore();}}}/*** 繪制表盤* * @param canvas*/private void drawCircle(Canvas canvas) {canvas.drawCircle(mHalfWidth, mHalfHeight, mHalfWidth - mHalfCircleLineWidth, mCirclePaint);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mHalfWidth = w / 2;mHalfHeight = h / 2;mLineLeft = mHalfWidth - mHalfLineWidth;mLineTop = mHalfHeight - mHalfWidth + mFixLineHeight;} }

    同樣的,有興趣的同學可以自己補上文字;


    四、canvas.skew( ) - 畫布的錯切:?

    [html] view plain copy print ?
  • /**??
  • ?*?Preconcat?the?current?matrix?with?the?specified?skew.??
  • ?*??
  • ?*?@param?sx?The?amount?to?skew?in?X??
  • ?*?@param?sy?The?amount?to?skew?in?Y??
  • ?*/??
  • public?native?void?skew(float?sx,?float?sy);??
  • /*** Preconcat the current matrix with the specified skew.** @param sx The amount to skew in X* @param sy The amount to skew in Y*/public native void skew(float sx, float sy);

    這個方法只要理解了兩個參數(shù)即可:

    float sx:將畫布在x方向上傾斜相應(yīng)的角度,sx為傾斜角度的tan值;

    float sy:將畫布在y軸方向上傾斜相應(yīng)的角度,sy為傾斜角度的tan值;

    注意,這里全是傾斜角度的tan值,比如我們打算在X軸方向上傾斜45度,tan45=1;

    先在X 軸上傾斜45 度,我們一起看看:

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ??
  • ????//?x?方向上傾斜45?度??
  • ????canvas.skew(1,?0);??
  • ????mPaint.setColor(0x8800ff00);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);// x 方向上傾斜45 度canvas.skew(1, 0);mPaint.setColor(0x8800ff00);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);} 效果如下:


    再在y軸上傾斜45度看看:

    [html] view plain copy print ?
  • @Override??
  • protected?void?onDraw(Canvas?canvas)?{??
  • ????super.onDraw(canvas);??
  • ????canvas.drawColor(Color.BLUE);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • ??
  • ????//?y?方向上傾斜45?度??
  • ????canvas.skew(0,?1);??
  • ????mPaint.setColor(0x8800ff00);??
  • ????canvas.drawRect(new?Rect(0,?0,?400,?400),?mPaint);??
  • }??
  • @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);// y 方向上傾斜45 度canvas.skew(0, 1);mPaint.setColor(0x8800ff00);canvas.drawRect(new Rect(0, 0, 400, 400), mPaint);} 此時效果如下:



    關(guān)于Canvas(畫布)的translate(平移)、scale(縮放) 、rotate(旋轉(zhuǎn)) 、skew(錯切)就說這么多,這些方法都不復(fù)雜,而靈活的使用往往能解決繪制中很多看似復(fù)雜的問題,所以重在理解,并在看到與之相關(guān)的效果時能夠及時恰當?shù)倪M行關(guān)聯(lián)。


    當然對Canvas的操作往往使用Matrix(后面會單獨講)也能達到同樣的效果,想看例子可參考?一個絢麗的loading動效分析與實現(xiàn)!


    源碼下載鏈接




    <script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script> rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css" /> <script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=410647"></script><script type="text/javascript">document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)</script> 頂
    15
    2
    <script type="text/javascript">function btndigga() { $(".tracking-ad[data-mod='popu_222'] a").click(); } function btnburya() { $(".tracking-ad[data-mod='popu_223'] a").click(); }</script>

    我的同類文章

    android動效篇(12) http://blog.csdn.net
    • ?Path特效之PathMeasure打造萬能路徑動效2015-07-26閱讀8378
    • ?Path相關(guān)方法講解(一)2015-06-15閱讀6706
    • ?Canvas開篇之drawBitmap方法講解2015-04-14閱讀22155
    • ?Android使用SVG矢量圖打造酷炫動效!2015-03-31閱讀36646
    • ?Paint、Canvas、Matrix使用講解(一、Paint)2015-03-18閱讀11862
    • ?Path相關(guān)方法講解(二)2015-07-19閱讀3457
    • ?Android 漂浮類動效的分析與實現(xiàn)!2015-04-22閱讀6852
    • ?Android Paint之 setXfermode PorterDuffXfermode 講解2015-04-07閱讀13335
    • ?一個絢麗的loading動效分析與實現(xiàn)!2015-03-23閱讀30643
    • ?自定義view實現(xiàn)水波紋效果2015-03-12閱讀14176
    更多文章 <script type="text/javascript">$(function () { GetCategoryArticles('2873607', 'tianjian4592','foot','45234419'); });</script> <script language="javascript" type="text/javascript">$(function(){ $.get("/tianjian4592/svc/GetSuggestContent/45234419",function(data){ $("#suggest").html(data); }); });</script> .blog-ass-articl dd { color: #369; width: 99%; /*修改行*/ float: left; overflow: hidden; font: normal normal 12px/23px "SimSun"; height: 23px; margin: 0; padding: 0 0 0 10px; margin-right: 30px; background: url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; } rel="stylesheet" href="http://static.blog.csdn.net/css/replace.css" />

    參考知識庫

    .NET知識庫

    1387關(guān)注|800收錄

    Android知識庫

    21013關(guān)注|1809收錄

    更多資料請參考: 猜你在找 <script src="http://csdnimg.cn/jobreco/job_reco.js" type="text/javascript"></script> <script type="text/javascript">csdn.position.showEdu({ sourceType: "blog", searchType: "detail", searchKey: "45234419", username: "", recordcount: "5", containerId: "adCollege" //容器DIV的id。 });</script>
    解析移動應(yīng)用的身份認證, 數(shù)據(jù)分析及信息推送
    TalkingData研發(fā)副總裁閻志濤:Spark在TalkingData移動大數(shù)據(jù)平臺的實踐
    WEB開發(fā):拉鉤網(wǎng)遮罩移動效果
    如何打造移動環(huán)境下滿足業(yè)務(wù)場景的高可用架構(gòu)
    移動直播技術(shù)專場:百萬彈幕下的直播禮物系統(tǒng)
    移動端干貨
    移動開發(fā)
    這個項目收集移動端開發(fā)所需要的一些資源與小技巧
    Android自定義繪制
    手機那點事已有高人把常見的不常見的坑都給找出來了我就隨便轉(zhuǎn)一下了
    <script type="text/javascript">$(function () { setTimeout(function () { var searchtitletags = 'Canvas之translate、scale、rotate、skew方法講解!' + ',' + $("#tags").html(); searchService({ index: 'blog', query: searchtitletags, from: 5, size: 5, appendTo: '#res', url: 'recommend', his: 2, client: "blog_cf_enhance", tmpl: '
    #{ title }
    ' }); }, 500); });</script> <script src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> width="728" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" οnlοad="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left:0;position:absolute;top:0;"><script>(adsbygoogle=window.adsbygoogle || []).push({});</script> 查看評論 10樓 又是美好一天 2016-09-07 21:03發(fā)表 [回復(fù)]
    “scale(float sx , float sy, float px,float py):先將畫布平移px,py,然后scale,scale結(jié)束之后再將畫布平移回原基準點;我們再在之前的基礎(chǔ)上繪制一個同樣的矩形,x , y 均縮放為 0.5 倍,縮放中心為矩形的中心;”這句話的意思是縮放中心為矩形中心,那為什么canvas.scale(0.5f, 0.5f);畫布在x,y方向上均縮放為 0.5 倍,使用默認基準點(原點 0,0),而不是矩形中心呢?
    9樓 code_river 2016-07-07 15:15發(fā)表 [回復(fù)]
    感謝樓主分享
    8樓 nailsoul 2016-03-29 23:30發(fā)表 [回復(fù)]
    贊一個 通過該栗子搞懂了save和restore的意思了 謝謝樓主了
    唉名字取的有奇異啊 xxState因該好理解點
    7樓 FionaRyan 2016-03-25 17:11發(fā)表 [回復(fù)]
    # 2016一線互聯(lián)網(wǎng)名企集結(jié)號# #實習#
    “簡尋”聯(lián)合阿里、搜狗、百度音樂、小米、蘑菇街、鳳凰網(wǎng)等 20+ 一線互聯(lián)網(wǎng)公司舉辦2016技術(shù)實習專場活動,?200+技術(shù)實習崗,通過審核的可獲5-10 次名企面試推薦。
    【報名方式】
    1.活動報名地址:https://h5.jianxun.io開啟一鍵求職
    2.搜索微信公眾號:jianxun-fuwu
    【面向群體】
    1. 實習生:2017 年及以后畢業(yè)的本科生/研究生,尋找技術(shù)類的 春季 / 暑期 實習
    2. 應(yīng)屆生:2016 年應(yīng)屆畢業(yè)生 , 技術(shù)類工作
    【活動時間】
    3月15日 - 5月15日
    注:春季/暑期實習皆可,具體事宜可與企業(yè)單獨商議
    【簡尋提供】
    1.??直接面試機會
    一線企業(yè):阿里B2B、搜狗、蘑菇街、小米、豌豆莢 等
    實力大牌:果殼網(wǎng)、人人、百度作業(yè)幫、鳳凰網(wǎng)、么么嗖?等
    新銳團隊:長亭科技、酷家樂、云校、野糖、海智網(wǎng)聚 等
    2. 活動福利
    最優(yōu)秀的三名學生將獲活動協(xié)辦方—— 包子IT 免費提供得北美頂尖 IT公司(Microsoft、google、facebook、Linkedin、amazon等)工程師進行一對一的全英模擬面試+指導(dǎo),面試優(yōu)異者可直接獲得北美名企的內(nèi)推機會。
    其他優(yōu)秀學生,包子IT 還將提供免費針對北美 CS 方向的模擬試題;頂尖公司和明星創(chuàng)業(yè)公司的多位老師們,將為大家講解 題目+背后線索,認真閱讀每一份考卷、每一行代碼,幫助大家提高代碼結(jié)構(gòu)和質(zhì)量。
    【活動流程】
    1.???報名注冊 → 2.???簡歷審核 → 3.???電話面試 → 4. 企業(yè)推薦 → 5. 企業(yè)復(fù)面 → 6. 發(fā)放offer
    6樓 yubaoma 2016-03-16 09:51發(fā)表 [回復(fù)]
    mark
    5樓 xiaomingi07 2016-02-26 15:41發(fā)表 [回復(fù)]
    介紹的東西太實用了,而且栗子也容易理解,一定要踩一下!
    4樓 mr_gang1992 2016-01-21 16:54發(fā)表 [回復(fù)]
    樓主在上面寫文字的時候,遇到一個問題,就是文字跟著畫布旋轉(zhuǎn)了,如何才能保證文字,文字不旋轉(zhuǎn)...望樓主解答啊。。。
    Re: 學問積年而成 2016-01-21 17:37發(fā)表 [回復(fù)]
    回復(fù)mr_gang1992:使用
    canvas.save();
    XXXX;
    canvas.restore();
    3樓 gongyong2008 2015-06-03 13:16發(fā)表 [回復(fù)]
    大神帶我飛啊
    2樓 kangGe_studio 2015-05-10 16:34發(fā)表 [回復(fù)]
    贊一個
    1樓 LFy_Yu 2015-05-08 09:10發(fā)表 [回復(fù)]
    給力
    您還沒有登錄,請 [登錄]或 [注冊] * 以上用戶言論只代表其個人觀點,不代表CSDN網(wǎng)站的觀點或立場 <script type="text/javascript">var fileName = '45234419'; var commentscount = 11; var islock = false</script><script type="text/javascript" src="http://static.blog.csdn.net/scripts/comment.js"></script> <script type="text/javascript">$(function () { $("#ad_frm_0").height("90px"); setTimeout(function(){ $("#ad_frm_2").height("200px"); },1000); });</script> .tag_list{background: none repeat scroll 0 0 #FFFFFF;border: 1px solid #D7CBC1;color: #000000;font-size: 12px;line-height: 20px;list-style: none outside none;margin: 10px 2% 0 1%;padding: 1px;}.tag_list h5{background: none repeat scroll 0 0 #E0DBD3;color: #47381C;font-size: 12px;height: 24px;line-height: 24px;padding: 0 5px;margin: 0;}.tag_list h5 a{color: #47381C;}.classify{margin: 10px 0;padding: 4px 12px 8px;}.classify a{margin-right: 20px;white-space: nowrap;}
    核心技術(shù)類目
    全部主題 Hadoop AWS 移動游戲 Java Android iOS Swift 智能硬件 Docker OpenStack VPN Spark ERP IE10 Eclipse CRM JavaScript 數(shù)據(jù)庫 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云計算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大數(shù)據(jù) aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap <script language="javascript" type="text/javascript">$(function(){ setTimeout(function(){ $.get("/tianjian4592/svc/GetTagContent",function(data){ $(".tag_list").html(data).show(); }); }); },500);</script> #popup_mask{position: absolute;width: 100%;height: 100%;background: #000;z-index: 9999;left: 0px;top: 0px;opacity: 0.3;filter: alpha(opacity=30);display: none;}<script type="text/javascript">$(function(){ setTimeout(function(){ $(".comment_body:contains('回復(fù)')").each(function(index,item){ var u=$(this).text().split(':')[0].toString().replace("回復(fù)","") var thisComment=$(this); if(u) { $.getJSON("https://passport.csdn.net/get/nick?callback=?", {users: u}, function(a) { if(a!=null&&a.data!=null&&a.data.length>0) { nick=a.data[0].n; if(u!=nick) { thisComment.text(thisComment.text().replace(u,nick)); } } }); } }); },200); setTimeout(function(){ $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); }) },5000); setTimeout(function(){ $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); }) },10000); setTimeout(function(){ $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); }) },15000); setTimeout(function(){ $("a img[src='http://js.tongji.linezing.com/stats.gif']").parent().css({"position":"absolute","left":"50%"}); },300); }); function loginbox(){ var $logpop=$("#pop_win"); $logpop.html(' src="https://passport.csdn.net/account/loginbox?service=http://static.blog.csdn.net/callback.htm" frameborder="0" height="600" width="400" scrolling="no">'); $('#popup_mask').css({ opacity: 0.5, width: $( document ).width() + 'px', height: $( document ).height() + 'px' }); $('#popup_mask').css("display","block"); $logpop.css( { top: ($( window ).height() - $logpop.height())/ 2 + $( window ).scrollTop() + 'px', left:($( window ).width() - $logpop.width())/ 2 } ); setTimeout( function () { $logpop.show(); $logpop.css( { opacity: 1 } ); }, 200 ); $('#popup_mask').unbind("click"); $('#popup_mask').bind("click", function(){ $('#popup_mask').hide(); var $clopop = $("#pop_win"); $("#common_ask_div_sc").css("display","none"); $clopop.css( { opacity: 0 } ); setTimeout( function () { $clopop.hide(); }, 350 ); return false; }); }</script> <script language="javascript" type="text/javascript" src="http://ads.csdn.net/js/async_new.js"></script>
    • 個人資料

    • 學問積年而成
      • 訪問:242632次
      • 積分:2709
      • 等級: 積分:2709
      • 排名:第10054名
      • 原創(chuàng):56篇
      • 轉(zhuǎn)載:0篇
      • 譯文:0篇
      • 評論:340條
    • 文章搜索
    <script type="text/javascript">$(function () { $("#btnSubmit").click(function () { search(); }); $("#frmSearch").submit(function () { search(); return false; }); function search() { var url = "http://so.csdn.net/so/search/s.do?q=" + encodeURIComponent($("#inputSearch").val()) + "&u=" + username + "&t=blog"; window.location.href = url; } });</script>
    • 文章分類
    • android動效篇(13)
    • 性能優(yōu)化(0)
    • 反編譯(0)
    • android常見問題(2)
    • 基礎(chǔ)總結(jié)(20)
    • javascript(5)
    • javaweb(11)
    • JDBC(3)
    • AJAX(1)
    • 心路歷程(0)
    • 文章存檔
      • 2015年07月(2)
      • 2015年06月(1)
      • 2015年05月(1)
      • 2015年04月(4)
      • 2015年03月(6)
      • 2015年02月(1)
      • 2012年09月(3)
      • 2012年08月(2)
      • 2012年07月(20)
      • 2012年06月(13)
      • 2012年05月(3)
      • 展開
    • 閱讀排行
    • Android使用SVG矢量圖打造酷炫動效!(36738)
    • 一個絢麗的loading動效分析與實現(xiàn)!(30684)
    • Canvas開篇之drawBitmap方法講解(22260)
    • 自定義view實現(xiàn)水波紋效果(14259)
    • Android Paint之 setXfermode PorterDuffXfermode 講解(13369)
    • Paint、Canvas、Matrix使用講解(一、Paint)(11889)
    • Canvas之translate、scale、rotate、skew方法講解!(8984)
    • 關(guān)于引入第三方j(luò)ar包引發(fā)的java.lang.NoClassDefFoundError解決(8766)
    • Path特效之PathMeasure打造萬能路徑動效(8404)
    • android動效開篇(8335)
    • 評論排行
    • 一個絢麗的loading動效分析與實現(xiàn)!(177)
    • 自定義view實現(xiàn)水波紋效果(33)
    • Paint、Canvas、Matrix使用講解(一、Paint)(25)
    • Android Paint之 setXfermode PorterDuffXfermode 講解(21)
    • Android使用SVG矢量圖打造酷炫動效!(20)
    • Canvas開篇之drawBitmap方法講解(15)
    • Canvas之translate、scale、rotate、skew方法講解!(11)
    • Animation & Property Animation 使用(9)
    • android動效開篇(8)
    • Android 漂浮類動效的分析與實現(xiàn)!(7)
    • 最新評論
    • 一個絢麗的loading動效分析與實現(xiàn)!

      碧海銀劍:@fanshouyizhi:大神,你這個demo很棒,不過進度會突然100%,不是平滑過渡的,而且到...

    • Android Paint之 setXfermode PorterDuffXfermode 講解

      george_zyf:頂樓主,開闊眼界了

    • Paint、Canvas、Matrix使用講解(一、Paint)

      Lgd_東:相恨見晚

    • 關(guān)于引入第三方j(luò)ar包引發(fā)的java.lang.NoClassDefFoundError解決

      聆聽璇律:studio怎么弄啊

    • 一個絢麗的loading動效分析與實現(xiàn)!

      jiong103:mOrangeRectF.right = mCurrentProgressPosition+mLef...

    • 一個絢麗的loading動效分析與實現(xiàn)!

      Liming4Android:好像demo中沒有加載到100%的時候那個風扇縮小和100%放大的那個代碼吧

    • 一個絢麗的loading動效分析與實現(xiàn)!

      Hebe_fans:這叫不難。。。我操

    • 自定義view實現(xiàn)水波紋效果

      隨手就是一巴掌叫你丫的做程序員:Bitmap too large to be uploaded into a texture (默認...

    • Android Paint之 setXfermode PorterDuffXfermode 講解

      隨手就是一巴掌叫你丫的做程序員:學習了,樓主辛苦!!!!

    • Android Paint之 setXfermode PorterDuffXfermode 講解

      W偉V:mark

    • 推薦文章
      • * 程序員10月書訊,評論得書
      • * Android中Xposed框架篇---修改系統(tǒng)位置信息實現(xiàn)自身隱藏功能
      • * Chromium插件(Plugin)模塊(Module)加載過程分析
      • * Android TV開發(fā)總結(jié)--構(gòu)建一個TV app的直播節(jié)目實例
      • * 架構(gòu)設(shè)計:系統(tǒng)存儲--MySQL簡單主從方案及暴露的問題
    id="iframeu2734128_0" src="http://pos.baidu.com/acrm?sz=200x200&rdid=2734128&dc=2&di=u2734128&dri=0&dis=0&dai=2&ps=2908x314&coa=at%3D3%26rsi0%3D200%26rsi1%3D200%26pat%3D6%26tn%3DbaiduCustNativeAD%26rss1%3D%2523FFFFFF%26conBW%3D1%26adp%3D1%26ptt%3D0%26titFF%3D%2525E5%2525BE%2525AE%2525E8%2525BD%2525AF%2525E9%25259B%252585%2525E9%2525BB%252591%26titFS%3D%26rss2%3D%2523000000%26titSU%3D0%26ptbg%3D90%26piw%3D0%26pih%3D0%26ptp%3D0&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1478326006940&ti=Canvas%E4%B9%8Btranslate%E3%80%81scale%E3%80%81rotate%E3%80%81skew%E6%96%B9%E6%B3%95%E8%AE%B2%E8%A7%A3%EF%BC%81%20-%20Ajian_studio%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91&ari=2&dbv=2&drs=3&pcs=1829x1019&pss=1829x19885&cfv=0&cpl=4&chi=3&cce=true&cec=UTF-8&tlm=1478326006&rw=1019&ltu=http%3A%2F%2Fblog.csdn.net%2Ftianjian4592%2Farticle%2Fdetails%2F45234419&ecd=1&psr=1920x1080&par=1846x1080&pis=-1x-1&ccd=24&cja=false&cmi=6&col=zh-CN&cdo=-1&tcn=1478326007&qn=c31dff3e505510bd&tt=1478326006861.137.138.470" width="200" height="200" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0; vertical-align:bottom;margin:0;" allowtransparency="true"> <script type="text/javascript">(window['cproStyleApi'] = window['cproStyleApi'] ||{})['u2734128']={at:'3',rsi0:'200',rsi1:'200',pat:'6',tn:'baiduCustNativeAD',rss1:'#FFFFFF',conBW:'1',adp:'1',ptt:'0',titFF:'%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91',titFS:'',rss2:'#000000',titSU:'0',ptbg:'90',piw:'0',pih:'0',ptp:'0'};/*服務(wù)器頻道首頁置頂Banner960*90,創(chuàng)建于2014-7-3*/(window.cproArray = window.cproArray || []).push({id:'u2734128'});</script> <script src="http://cpro.baidustatic.com/cpro/ui/c.js" type="text/javascript"></script> <script type="text/javascript" src="http://c.csdnimg.cn/rabbit/cnick/cnick.js"></script><script type="text/javascript" src="http://static.blog.csdn.net/scripts/newblog.min.js"></script><script type="text/javascript" src="http://medal.blog.csdn.net/showblogmedal.ashx?blogid=1298835"></script><script type="text/javascript" src="http://static.blog.csdn.net/scripts/JavaScript1.js"></script> rel="stylesheet" type="text/css" href="//csdnimg.cn/pubfooter/css/pub_footer_2014.css" />
    公司簡介 | 招賢納士 | 廣告服務(wù) | 銀行匯款帳號 | 聯(lián)系方式 | 版權(quán)聲明 | 法律顧問 | 問題報告 | 合作伙伴 | 論壇反饋
    網(wǎng)站客服 雜志客服 微博客服 webmaster@csdn.net 400-600-2320 | 北京創(chuàng)新樂知信息技術(shù)有限公司 版權(quán)所有 | 江蘇知之為計算機有限公司 | 江蘇樂知網(wǎng)絡(luò)技術(shù)有限公司
    src="about:blank" frameborder="0" scrolling="no" style="z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%;background:transparent"> 您有 0條新通知 <script id="noticeScript" type="text/javascript" btnid="header_notice_num" wrapid="note1" count="5" subcount="5" src="//csdnimg.cn/rabbit/notev2/js/notify.js?9d86d94"></script> <script type="text/javascript" src="http://passport.csdn.net/content/loginbox/login.js"></script><script type="text/javascript">document.write(" ");</script> <script type="text/javascript" src="http://www.csdn.net/ui/scripts/Csdn/counter.js"></script><script type="text/javascript" charset="UTF-8" src="http://message.csdn.net/msg.popup.js"></script><script type="text/javascript" src="http://ad.csdn.net/scripts/ad-blog.js"></script><script type="text/javascript">$(function () { function __get_code_toolbar(snippet_id) { return $(" " + " "); } $("[code_snippet_id]").each(function () { __s_id = $(this).attr("code_snippet_id"); if (__s_id != null && __s_id != "" && __s_id != 0 && parseInt(__s_id) > 70020) { __code_tool = __get_code_toolbar(__s_id); $(this).prev().find(".tools").append(__code_tool); } }); $(".bar").show(); });</script> <script id="csdn-toolbar-id" btnid="header_notice_num" wrapid="note1" count="5" subcount="5" type="text/javascript" src="http://c.csdnimg.cn/public/common/toolbar/js/toolbar.js"></script> href="http://c.csdnimg.cn/comm_ask/css/ask_float_block.css" type="text/css" rel="stylesheet" /> <script language="JavaScript" type="text/javascript" src="http://c.csdnimg.cn/comm_ask/js/libs/wmd.js"></script> <script language="JavaScript" type="text/javascript" src="http://c.csdnimg.cn/comm_ask/js/libs/showdown.js"></script> <script language="JavaScript" type="text/javascript" src="http://c.csdnimg.cn/comm_ask/js/libs/prettify.js"></script> <script language="JavaScript" type="text/javascript" src="http://c.csdnimg.cn/comm_ask/js/apps/ask_float_block.js"></script> <script id="adJs52b5334" src="http://ads.csdn.net/js/opt/52b5334.js?t=0.2122191662760713"></script> <script>document.getElementById("adJs52b5334").src = "http://ads.csdn.net/js/opt/52b5334.js?t=" + Math.random();</script> rel="stylesheet" href="http://static.blog.csdn.net/css/blog_code.css" /> <script type="text/javascript" src="http://static.blog.csdn.net/scripts/saveToCode.js"></script> <script type="text/javascript" src="//csdnimg.cn/rabbit/tracking-ad/main.js?75eacd8"></script> rel="stylesheet" type="text/css" media="screen" href="http://ask.csdn.net/assets/ask_float_fonts_css-6b30a53970eb5c3a2a045e3df585b475.css" />

    提問

    您的問題將會被發(fā)布在“技術(shù)問答”頻道 × 該問題已存在,請勿重復(fù)提問 插入鏈接 本地上傳 網(wǎng)絡(luò)圖片 src="http://ask.csdn.net/upload.html"> 插入圖片 | | | | | | ?? 0 0 0:0 推薦標簽: 我要懸賞 取消 發(fā)布 可能存在類似的問題: 我想提一個新問題

    保存代碼片

    整理和分享保存的代碼片,請訪問代碼筆記
    • *標題
    • *描述
    • ?標簽 Canvasx android畫布x canvas.translatex canvas.scalex canvas.rotatex
    • 取消 確定

    總結(jié)

    以上是生活随笔為你收集整理的Canvas之translate、scale、rotate、skew的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日本在线中文在线 | 综合色中文 | 亚洲精品国产电影 | av在线之家电影网站 | 日本中文字幕网站 | 国产一区二区三区视频在线 | 精品久久美女 | 91视频观看免费 | 人成在线免费视频 | 久久999久久 | 亚洲另类在线视频 | 久久久五月婷婷 | 天天色综合天天 | 亚洲第一区在线观看 | 久久成人国产精品一区二区 | 91精品视频一区 | 天天骚夜夜操 | 国产一区二区在线观看视频 | 成人小视频在线 | 国产91免费在线观看 | 一区二区三区在线观看免费 | 免费欧美高清视频 | 99久久免费看 | 正在播放五月婷婷狠狠干 | 久久精品视频中文字幕 | 最新成人在线 | 国产网站在线免费观看 | 夜夜操天天干 | 日韩在线视频网址 | 色就色,综合激情 | 香蕉视频导航 | 亚洲精品视频在线播放 | 日韩精品久久久久久久电影竹菊 | 欧美精品在线免费 | 亚洲天堂va | 成年人免费看 | 日韩伦理片hd | 99热在线免费观看 | 精品国产伦一区二区三区免费 | 国产 一区二区三区 在线 | 三级av片 | 91看片看淫黄大片 | 久久久久国产精品视频 | 欧美黄在线 | 人人射人人射 | 黄色网址在线播放 | 黄色片免费电影 | 免费观看丰满少妇做爰 | 亚洲五月婷婷 | 综合网天天色 | 久久狠狠亚洲综合 | 999亚洲国产996395 | 91资源在线播放 | 色资源在线 | 在线亚洲午夜片av大片 | 91九色精品| 成人av一区二区三区 | 91精品国自产在线观看欧美 | 国产手机av | 99九九99九九九视频精品 | 成人黄色电影在线播放 | 久久躁日日躁aaaaxxxx | 国产精品美女久久久久久久 | 日本中文字幕电影在线免费观看 | 国产免费观看av | 色欧美日韩 | 久久精品一二三区 | 日韩剧情 | 久久精品超碰 | 韩日电影在线 | 久久久99精品免费观看app | 欧美精品久久久久久久亚洲调教 | 人人擦 | 国产黄色免费电影 | 9999精品免费视频 | 久久av一区二区三区亚洲 | 手机看片福利 | 色综合久久88色综合天天免费 | 91中文字幕在线视频 | 久草资源在线 | 国产三级午夜理伦三级 | 丁香九月激情综合 | 黄色毛片视频免费 | 九九久久电影 | 天天操天天干天天综合网 | 亚洲国产激情 | 久草爱 | 中文国产字幕在线观看 | 日韩三级中文字幕 | 99精品视频免费在线观看 | 色视频成人在线观看免 | 欧美日本啪啪无遮挡网站 | 中文字幕av日韩 | 国产精品毛片一区二区 | 久久久久久久久久电影 | 国产视频一区二区在线观看 | 久久av影视 | 天天操操操操操操 | 国产在线观看国语版免费 | 亚洲视频专区在线 | 亚洲综合干 | 日本护士三级少妇三级999 | 欧美日韩在线精品一区二区 | 久久久久久久久久久影视 | 中文字幕在线免费播放 | 亚洲精品综合在线观看 | 日韩二区三区在线观看 | 日韩欧美高清一区二区 | www.色com| 在线日韩视频 | 欧美午夜寂寞影院 | 国产aaa免费视频 | 国产亚洲精品久久久久久久久久 | 综合久久网 | 国产午夜精品在线 | 婷婷色网视频在线播放 | 国产精品国产三级国产aⅴ入口 | 国产精品系列在线 | 天天干天天干天天射 | 国产精品一区二区三区免费视频 | 四虎影视精品永久在线观看 | 免费色视频网站 | 免费人成在线观看网站 | 精品在线播放 | 亚洲午夜久久久久 | 一区二区三区四区五区在线 | 国产生活一级片 | 精品国产伦一区二区三区观看体验 | 日韩激情精品 | 国产资源在线观看 | 91免费看黄 | 99精品在线视频播放 | 欧美日韩破处 | 亚洲国产婷婷 | 97爱| 伊人六月 | av线上免费看 | 日日天天狠狠 | 精品美女久久久久 | 国产成人精品网站 | 亚洲精品综合一区二区 | 最新av免费在线观看 | 96视频免费在线观看 | 国产成人一级 | 日日夜夜免费精品 | 日韩在线视频二区 | 免费观看黄色12片一级视频 | 久久经典国产 | 免费a v在线 | 不卡电影免费在线播放一区 | 国产精品久久久久久电影 | bbbb操bbbb| 久久综合五月婷婷 | 免费91在线观看 | 亚洲精品乱码久久 | 日本精品一区二区三区在线观看 | 免费a v观看 | 国产成人精品三级 | 91视频高清完整版 | 国产精品久久久久久久久久直播 | 午夜精品久久久久久久99热影院 | 丁香花在线视频观看免费 | 亚洲欧洲精品在线 | 欧美日韩一区久久 | 韩国在线一区 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 最新真实国产在线视频 | 久久精品成人欧美大片古装 | 麻豆av一区二区三区在线观看 | 97操碰| 九9热这里真品2 | 国产亚洲婷婷 | 狠狠狠色丁香综合久久天下网 | 97超碰伊人| 奇米网8888| 久久综合狠狠综合久久激情 | 草草草影院 | 国产精品久久久久一区二区国产 | 国产视频精品网 | 国产精品久久久久久久av电影 | 久久天天操 | 免费av黄色 | 在线亚洲欧美视频 | 蜜桃av人人夜夜澡人人爽 | 免费91在线观看 | 亚洲精品福利在线观看 | 国产小视频免费在线网址 | 午夜成人影视 | 99c视频高清免费观看 | 九九热视频在线播放 | 在线播放一区 | 亚洲激情精品 | 亚州精品成人 | 91夫妻自拍 | 在线黄色国产 | 国产亚洲精品女人久久久久久 | 国产精品去看片 | 国产精品入口麻豆 | 欧美一区免费在线观看 | 精品久久久久久亚洲综合网 | 久久久久久国产精品亚洲78 | 婷婷日韩 | 手机在线看片日韩 | 国产精品永久免费视频 | 探花视频免费观看 | 国产九色在线播放九色 | 97视频人人 | 色综合天天综合 | 一级成人网 | 狠狠色丁香婷婷综合基地 | 视频直播国产精品 | 521色香蕉网站在线观看 | 黄网站免费大全入口 | 久久综合婷婷 | 欧美韩国日本在线 | 日韩高清一区在线 | 日本在线成人 | 伊人夜夜| 欧美成人播放 | 日本黄色免费观看 | 国产美女在线精品免费观看 | 91一区二区三区久久久久国产乱 | 久久久久久综合 | 久久人人爽人人片 | 一区中文字幕在线观看 | 成人午夜精品 | 天天天操天天天干 | 久久人人爽视频 | 人人搞人人搞 | 亚洲一级二级三级 | 免费黄色激情视频 | 4438全国亚洲精品观看视频 | 国产精品2019 | 国产亚洲久一区二区 | 日日爽夜夜操 | 福利片视频区 | 久久精品高清视频 | 国产一级精品绿帽视频 | 99色| 99久久99久久精品免费 | 91久久国产综合精品女同国语 | 久久久久免费看 | 国产精品欧美久久 | www.亚洲黄色| 久久 精品一区 | 亚洲成人av在线电影 | 草莓视频在线观看免费观看 | 亚洲爱爱视频 | 久久免费视频一区 | 欧美一级免费黄色片 | 成年人黄色在线观看 | 国产精品久久久777 成人手机在线视频 | 在线中文字幕视频 | 中文字幕2021 | 国产拍揄自揄精品视频麻豆 | 国产最新视频在线 | 奇米7777狠狠狠琪琪视频 | 日韩av中文在线观看 | 国产精品91一区 | 欧美成人xxxx| 国产最新福利 | a精品视频| 丁香花在线视频观看免费 | 日本99热| av一级一片| www.大网伊人 | 欧美日本啪啪无遮挡网站 | 国产一区精品在线观看 | 亚洲视频电影在线 | 日本黄色免费播放 | 99精品欧美一区二区三区 | 久久不射影院 | 中文字幕国产精品 | 国内成人av| 中文字幕在线观看的网站 | 国产中文字幕国产 | 玖玖视频精品 | 午夜婷婷在线播放 | 激情av一区二区 | 中文字幕在线播放日韩 | 国产精品一区二区三区在线免费观看 | 18pao国产成视频永久免费 | 国产99亚洲| 黄色tv视频 | 日韩色在线观看 | 国产精品原创视频 | 美女视频黄,久久 | 精品亚洲网 | 国产一区免费在线观看 | 日韩中文字幕在线看 | 国产96精品 | 精品久久久久_ | 一区二区视频电影在线观看 | 婷婷在线视频观看 | 最新日韩精品 | 中文字幕123区 | 日韩在线字幕 | 精品人妖videos欧美人妖 | 五月天天色 | 精品国产一区二区三区不卡 | 国产精品毛片一区二区在线 | 亚洲午夜精品久久久久久久久久久久 | 国产亚洲婷婷免费 | 伊人狠狠色 | 不卡国产视频 | 欧美精品黑人性xxxx | 色就干| 99精品视频精品精品视频 | 日日夜夜精品免费视频 | 午夜性生活 | 国产九九热视频 | 久久只精品99品免费久23小说 | 亚洲精品裸体 | 狠狠躁夜夜躁人人爽视频 | 久久久精品视频成人 | 98超碰人人 | 九七视频在线观看 | 中文字幕中文字幕在线中文字幕三区 | 最近中文字幕完整视频高清1 | 91视视频在线直接观看在线看网页在线看 | 丁香婷婷激情 | 国产精品高清一区二区三区 | 久久综合成人网 | 久草视频在线观 | 伊人久久av| 国产一级久久 | 国产一区二区三区视频在线 | 色老板在线 | 久精品在线观看 | 91丨九色丨蝌蚪丨老版 | 99精品免费在线 | 日韩av资源站 | www日日夜夜 | 黄色一级大片免费看 | 一区二区三区www | 国产高清日韩欧美 | 久久精品一区二区国产 | 中文字幕视频免费观看 | 亚洲精品国偷自产在线91正片 | 欧美日韩一区二区在线观看 | 成人av电影在线播放 | 天天色天天射天天综合网 | 美女视频国产 | 成片免费观看视频999 | 香蕉视频在线观看免费 | 免费看片网址 | 国产一级视频在线观看 | 操高跟美女 | 开心色激情网 | 高清不卡一区二区在线 | 国产精品mv在线观看 | 欧美视屏一区二区 | 正在播放国产精品 | 亚洲精品日韩在线观看 | 深爱激情五月婷婷 | 国产 视频 高清 免费 | 天天爽天天爽天天爽 | 精品久久免费看 | 成人久久18免费 | 久久久久伦理电影 | 久久99久久99精品免观看粉嫩 | 国产在线播放不卡 | 亚洲免费一级电影 | 日日添夜夜添 | 久久成人麻豆午夜电影 | 天天综合网入口 | 丁香久久| 91热| 亚洲国产欧美在线人成大黄瓜 | 国产va饥渴难耐女保洁员在线观看 | 欧美福利在线播放 | 精品国产一区二区三区久久影院 | 丁香久久婷婷 | 激情婷婷六月 | 福利一区视频 | 黄色小说免费在线观看 | 在线一二三四区 | 成人动漫精品一区二区 | 人人插人人草 | 中文字幕第一页在线播放 | 久草成人在线 | 中文字幕a∨在线乱码免费看 | 少妇bbbb搡bbbb搡bbbb | 久久国语 | 婷婷99| 国产黄色大全 | 日韩有码在线观看视频 | 麻豆激情电影 | 成人久久精品 | 久久露脸国产精品 | 国产在线播放观看 | 日日爽天天爽 | 日韩精品视频免费看 | 亚洲视频中文 | 2023亚洲精品国偷拍自产在线 | 天天干天天操天天操 | 国产精品999久久久 久产久精国产品 | 国产色资源 | 在线观看中文字幕 | 99久久精品国产毛片 | 欧美国产视频在线 | 久久天天操 | 国产一区二区精品久久91 | 亚洲一区在线看 | 国产精品乱码一区二区视频 | 亚洲涩涩涩涩涩涩 | 一级黄色毛片 | 亚洲狠狠干| 人人插人人看 | 精品久久免费看 | 丁香久久激情 | 国产精品四虎 | 日韩在线免费小视频 | 又湿又紧又大又爽a视频国产 | 91成人午夜 | 免费黄色特级片 | 国产中文字幕在线播放 | 91精品导航| 国产精品女人久久久 | 国内精自线一二区永久 | 91在线小视频 | 91精品天码美女少妇 | 国产视频不卡 | 亚洲资源在线观看 | 久久精品人人做人人综合老师 | 免费av网址大全 | 成人av资源 | 欧美日韩不卡一区二区三区 | 亚洲成人资源在线观看 | 精品中文字幕在线观看 | 中文字幕一区二区三区四区久久 | 天天看天天干天天操 | 天天躁日日躁狠狠躁av麻豆 | 黄色毛片电影 | 国产自制av | 久久天天综合网 | 黄p网站在线观看 | 国产免费资源 | 日韩视频1| 一区 二区电影免费在线观看 | 国产高清视频免费在线观看 | 免费福利在线观看 | 欧美日韩中文字幕视频 | 国产一区二区免费在线观看 | 免费看的黄色小视频 | 久久久久久久久久影视 | 三三级黄色片之日韩 | 99久久日韩精品免费热麻豆美女 | 久久国产视屏 | 亚洲综合在线五月 | 开心综合网 | 伊人午夜 | 国产中文字幕大全 | 日韩成人在线免费观看 | 国产原创av在线 | 91成版人在线观看入口 | 黄色一级动作片 | 国产精品久久久久毛片大屁完整版 | 国产成人精品一区二区三区网站观看 | 99r在线观看 | 亚洲国产精品女人久久久 | 四虎成人精品永久免费av | 久久草网站| 久久人人爽视频 | 正在播放一区二区 | 久久久官网 | 亚洲 欧美 国产 va在线影院 | 久草视频免费播放 | 日本一区二区三区免费观看 | 日韩 在线a | 特级免费毛片 | 日本久久综合视频 | 一区二区三区四区在线 | 三级大片网站 | 全黄网站| 99 视频 高清 | 四季av综合网站 | 色婷婷88av视频一二三区 | 激情综合五月婷婷 | 色婷婷综合视频在线观看 | 久久久久久久久久久久久久电影 | 久久久免费国产 | 欧美激情精品一区 | av三级在线看| 久久久久久久久久久久久久av | 午夜一级免费电影 | 亚洲 综合 国产 精品 | 色六月婷婷 | 成人在线免费小视频 | 天天天天干 | 国产精品资源在线观看 | 人人插人人草 | 国色天香在线观看 | 麻豆精品视频 | 欧美最爽乱淫视频播放 | 久草视频手机在线 | 欧美日韩国产三级 | 国产一级二级在线播放 | 久久久在线观看 | 久久99精品久久只有精品 | 最新日韩视频 | av在线直接看 | 91最新在线视频 | 亚洲国产一二三 | 色婷婷狠| aaa日本高清在线播放免费观看 | 丁香综合五月 | 国产精品高清在线观看 | 久久伊人爱 | 99久久99久久 | 91香蕉视频在线下载 | 伊人久久在线观看 | 免费av大全 | 亚洲无吗av| 欧美日韩视频免费 | 天天色天天爱天天射综合 | 久久草视频 | 日日夜夜天天久久 | 在线免费黄色片 | 国产在线2020| 久久久久久久久久久久久久免费看 | 亚洲va男人天堂 | 成人在线黄色 | 婷婷综合av | 四虎国产免费 | 成年一级片 | 天天综合成人网 | 日韩精品一区在线观看 | 天天操天天爱天天爽 | 免费福利在线视频 | 久久免费视频2 | 丁香激情综合国产 | 麻豆国产视频下载 | 久操中文字幕在线观看 | 天天操天天操天天操天天操天天操 | 国内综合精品午夜久久资源 | 国产在线观看不卡 | 国产精品一区二区久久精品爱微奶 | 狠狠干电影 | 日韩精品一区二区电影 | 在线网址你懂得 | 亚洲 欧洲av | 欧美日韩在线免费观看 | 天天爽夜夜爽人人爽一区二区 | 9999精品免费视频 | 日韩激情av在线 | www.色国产 | 亚洲精品视频网站在线观看 | 韩国av一区二区三区在线观看 | 色婷婷免费视频 | 午夜10000| 国产一区二区不卡视频 | 福利电影一区二区 | 欧美黄网站 | 欧美 国产 视频 | 深夜免费福利视频 | 亚洲视频久久久久 | 中文字幕888 | 日日干夜夜爱 | 成人a免费| 日本在线观看中文字幕无线观看 | 国产精品欧美久久久久天天影视 | 精品久久一区二区三区 | 亚洲精品美女在线观看播放 | av亚洲产国偷v产偷v自拍小说 | 国产美女在线免费观看 | av看片网| 亚洲在线精品视频 | 亚洲精品大片www | 成年人视频免费在线播放 | 久久五月情影视 | 国产1区在线 | 国产精品美女网站 | 免费在线色电影 | 亚洲综合网 | 成人午夜网址 | 久久久99精品免费观看 | 在线免费高清 | 精品999在线观看 | 超碰999| 国产精品久久久久国产精品日日 | av免费在线观看网站 | 亚洲精品乱码久久 | 久久免费黄色 | 91在线视频精品 | 青春草视频在线播放 | 91观看视频| 亚洲精品国 | 久久久久久久久久久成人 | 91污污视频在线观看 | 99综合影院在线 | 中文字幕高清在线播放 | 成人av电影免费在线播放 | 亚洲 欧美 另类人妖 | 日韩精品高清不卡 | 九草视频在线 | 在线免费观看视频a | 超碰在线cao | 2018亚洲男人天堂 | av电影免费在线看 | 欧美一级免费片 | 伊人影院在线观看 | 久草久热 | 香蕉视频18| 国产69久久精品成人看 | 天天草天天插 | 欧美午夜一区二区福利视频 | 国产一区二区在线免费视频 | 国产夫妻自拍av | 91av网站在线观看 | 丁香婷婷激情国产高清秒播 | 天天激情 | 国产精品毛片网 | 在线色亚洲 | 国产不卡在线观看 | 午夜的福利 | 九色在线视频 | 欧美日韩精品区 | 成人在线播放av | 亚洲理论片在线观看 | 精品在线亚洲视频 | a黄色一级 | 国内精品久久久久久久影视简单 | 91免费国产在线观看 | 91亚洲精品久久久久图片蜜桃 | 久久成人人人人精品欧 | 亚洲最新毛片 | 久久永久视频 | 国产精品高清在线 | 高清中文字幕 | 色狠狠一区二区 | av资源在线看 | 天天操天天操天天操天天操天天操 | 欧美在一区 | 蜜桃av人人夜夜澡人人爽 | 丁香六月久久综合狠狠色 | 日韩性久久 | 成人资源网 | 免费视频一二三区 | 久久人人爽人人人人片 | 免费黄色在线 | 亚洲精品www. | 九九热视频在线播放 | 欧美日韩国产一二三区 | 亚洲电影一级黄 | 欧美性大战 | 黄色录像av| 91九色蝌蚪视频网站 | 免费高清无人区完整版 | 久久久免费精品国产一区二区 | 中文字幕资源在线 | 欧美不卡视频在线 | 日韩电影在线观看一区二区 | 国产成人精品亚洲精品 | 91综合久久一区二区 | 欧美一级片在线免费观看 | 日韩在线观看视频在线 | 91在线免费播放视频 | 亚洲精品视频网 | 国产精品理论片 | 一区二区三区日韩在线 | 最新国产在线观看 | 精品亚洲二区 | 亚洲午夜久久久久久久久电影网 | 九色91在线视频 | 久久理论片| 日韩在线电影一区二区 | 在线观看第一页 | 99久久精品国产一区 | 精品久久一区二区三区 | 欧美91成人网 | 又长又大又黑又粗欧美 | www91在线观看| 一本大道久久精品懂色aⅴ 五月婷社区 | 日本一区二区不卡高清 | 免费亚洲视频 | 国产精品一区二区在线播放 | 欧美日韩另类在线观看 | 狠狠色噜噜狠狠 | 久久免费中文视频 | 亚洲日韩中文字幕 | 97韩国电影| 国产精品一区二区美女视频免费看 | 国产视频美女 | 欧美一区二区免费在线观看 | 成人电影毛片 | 十八岁以下禁止观看的1000个网站 | 日日激情| 亚洲精品视频二区 | 五月婷婷国产 | 国产精品欧美久久 | av大全在线免费观看 | 欧美三级在线播放 | 免费人成网 | 日本午夜在线亚洲.国产 | 日韩精品一区二区在线视频 | 三上悠亚在线免费 | 97在线视频免费播放 | 久久天天躁狠狠躁亚洲综合公司 | 久久精品亚洲一区二区三区观看模式 | 福利视频网站 | 国产精品 欧美 日韩 | 午夜视频在线观看一区二区三区 | 国外调教视频网站 | 久久综合色天天久久综合图片 | 成人天堂网 | 国产成人久久精品一区二区三区 | 亚洲一级免费电影 | 欧美色图p | 国产成人久久av | 黄色1级毛片 | 亚洲国产日本 | 91精品亚洲影视在线观看 | 久久久国产精品麻豆 | 国产精品久久久久久一区二区三区 | 免费看三级黄色片 | 亚洲综合色播 | jizz999| 免费看污的网站 | 91在线精品视频 | 日批视频在线播放 | 久久在现| 国产亚州av| 亚洲综合激情网 | 国产精品人人做人人爽人人添 | 97超碰精品 | 天天干天天操人体 | 国产伦理久久 | 天天干,天天操 | 狠狠躁天天躁综合网 | 香蕉视频在线免费 | 视频二区在线视频 | 99免费在线观看 | 日韩欧美精品在线 | 国产录像在线观看 | 亚洲电影第一页av | 91精品免费视频 | 欧美一级电影 | 天天干天天摸 | 91九色蝌蚪视频在线 | 国产不卡视频在线播放 | 亚洲成av人影片在线观看 | 国产日产精品一区二区三区四区 | 久久精品精品电影网 | 久久视频精品在线 | 日韩在线观看小视频 | 久久久久久毛片精品免费不卡 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 66av99精品福利视频在线 | 中文字幕av免费在线观看 | 激情视频免费在线 | 国产精品日韩久久久久 | 日韩91精品 | 91视频 - 88av| 久久久久久久久久久福利 | 91免费版在线 | 亚洲成人av在线播放 | 黄色av电影免费观看 | av观看免费在线 | 四虎国产精品永久在线国在线 | 天天摸天天操天天舔 | 色婷婷伊人| 色吊丝在线永久观看最新版本 | 一区二区三区 中文字幕 | 免费亚洲精品 | 久久免费福利视频 | 久久久久欧美精品 | 日日爱av | 久久综合影院 | 成人激情开心网 | 欧美一区二区三区在线播放 | 午夜 在线 | 中文字幕一区二区三区久久蜜桃 | 国产精品自在线拍国产 | 99产精品成人啪免费网站 | 亚洲爱视频 | 国产精品网红福利 | 国产色中涩 | 婷婷在线免费观看 | 国产精品乱看 | 一区二区久久久久 | 久久久久久草 | 在线亚洲欧美视频 | 午夜在线观看一区 | 在线 国产一区 | 久久国内精品 | 六月婷色 | 欧美综合干| 国产欧美中文字幕 | 91在线免费观看国产 | 中文字幕在线视频免费播放 | 欧美成人一区二区 | 欧美性色19p | 97人人艹 | 亚洲欧美国产日韩在线观看 | 中文字幕丝袜 | 亚洲视频免费在线 | 国产成人精品午夜在线播放 | 婷婷av网站| 亚洲一区二区视频在线 | 97在线视频观看 | 日本九九视频 | 国产录像在线观看 | 免费视频黄 | 日日夜夜免费精品 | 国产精品免费在线观看视频 | 国产成人av电影 | 国产伦理一区 | 91av成人| 日韩中文在线视频 | 国产99中文字幕 | 成人免费视频在线观看 | 日一日干一干 | 超碰公开在线观看 | 精品国产一二三 | 日韩av不卡在线 | 久久手机精品视频 | 免费观看成人网 | 999热视频| 在线观看亚洲免费视频 | 成人免费观看a | 久久亚洲日本 | 亚洲精品字幕 | 中国一区二区视频 | 黄色免费av| 国产精品专区在线观看 | 一级a性色生活片久久毛片波多野 | 日日操操操 | 91九色精品女同系列 | 欧美va电影 | 国产精品18久久久久久久网站 | 久久视频精品在线 | 久久精品一区 | 免费黄色网址网站 | 成人h在线| 日韩av中文在线观看 | 亚洲成人av电影在线 | 久久久午夜剧场 | 2022久久国产露脸精品国产 | 国产免费一区二区三区最新6 | 四虎在线免费 | 国产精品久久久精品 | 99久久毛片| 成人网大片| 日韩欧美在线一区 | 看毛片网站 | 狠狠狠狠狠狠操 | 天天色天天色 | 成人a级免费视频 | 丁香狠狠 | 久久伦理| 婷婷久久国产 | 欧美综合在线视频 | 久久免费国产精品1 | 国产精品伦一区二区三区视频 | 在线91网 | 久久成人高清视频 | 国产精品手机在线观看 | 久久国产精彩视频 | 久久久一本精品99久久精品 | 久久与婷婷 | 超碰在线观看av.com | 韩国视频一区二区三区 | 日韩av手机在线观看 | 成人va视频 | 超碰97人人干 | 99草视频在线观看 | 久久精品导航 | 日韩免费观看一区二区三区 | 激情在线网| 国产成人精品一区在线 | 高清av网 | 国产亚洲成av片在线观看 | 国产黄大片在线观看 | 人人超碰97 | 五月婷婷激情网 | 欧美一级小视频 | 欧美日韩高清一区二区 国产亚洲免费看 | 久久久不卡影院 | 99精品在线视频播放 | 在线免费视频a | 日日添夜夜添 | 麻豆成人网 | 日韩精品久久久免费观看夜色 | 日韩高清免费观看 | 夜夜视频欧洲 | 91视频免费 | 五月婷婷久草 | 美女很黄免费网站 | 成年人在线免费看片 | 日韩av线观看 | 久久久久欧美精品999 | 美女免费黄视频网站 | 久久久久久久国产精品影院 | 色大片免费看 | 久久男人免费视频 | 午夜视频在线观看一区 | 91丨九色丨国产丨porny精品 | 在线视频第一页 | 草久视频在线 | 三级视频国产 | 精品欧美小视频在线观看 | 亚洲传媒在线 | 国产精品男女啪啪 | 日韩美女高潮 | 免费毛片aaaaaa | 2024av| 国产午夜精品一区二区三区 | 欧美人交a欧美精品 | 久久人人爽爽 | 一区二区三区四区免费视频 | 美女视频一区 | 日韩免费一级电影 | 久久久久久久久久久电影 | 日韩毛片在线播放 | 久久一区二 | 国产青春久久久国产毛片 | 99久久久国产精品免费观看 | 久久久久一区二区三区四区 | 成人免费在线视频 | 国产一级特黄电影 | 手机色在线 | 超碰97中文 | 欧美亚洲一区二区在线 | 日韩免费在线观看视频 | 午夜私人影院久久久久 | 中文字幕影片免费在线观看 | 91精品国自产在线观看 | 国产五十路毛片 | 又色又爽又激情的59视频 | 高清久久久久久 | 日韩在线观看视频在线 | 中文字幕在线播放一区二区 | 天天天天天天操 | 国产精品18久久久久白浆 | av一级网站| 天天综合网在线 | 免费福利在线 | 中文字幕国产精品一区二区 | 国产精品久久久久国产精品日日 | 最新午夜电影 | 久久成人精品视频 | 奇米先锋 | 91热爆视频 | 在线视频你懂 | 国产剧情av在线播放 | 日韩精品影视 | 国产成人精品一区二区在线观看 | 精品主播网红福利资源观看 | 看黄色91 | 伊人久久精品久久亚洲一区 | 亚洲日韩中文字幕在线播放 | 日韩黄色软件 | 国产日韩精品久久 | 99免费精品视频 | 黄色不卡av | 国产最新91 | 在线免费观看视频a | 中文字幕一区二区三区乱码在线 | 在线 国产 日韩 | 亚洲精品国产精品久久99热 | 亚洲狠狠婷婷综合久久久 | 五月天婷婷在线观看视频 | 久久久国产影院 | 亚洲精品婷婷 | 中文字幕在线观看免费 | 综合激情网... | 99久国产| 免费91麻豆精品国产自产在线观看 | 亚洲欧美经典 | 国产涩涩网站 | 久久99在线视频 | 91最新国产 | 久草国产精品 | 国产精品久久久久久久久免费 | 国产精品一区二区白浆 | 99re国产视频 | 久久夜av | 在线播放精品一区二区三区 | 欧美人zozo | 午夜视频在线观看网站 | 久久黄色免费视频 | 免费在线看成人av | 国内免费久久久久久久久久久 | 91麻豆国产 | 免费特级黄毛片 | 国产日本在线观看 | 亚洲精品国产电影 | 91精品天码美女少妇 | 亚洲一区二区三区精品在线观看 | 久青草视频在线观看 | 伊人天天狠天天添日日拍 | 在线观看爱爱视频 | 91丨精品丨蝌蚪丨白丝jk | 丁香婷婷激情国产高清秒播 | 六月婷色 | 成人免费 在线播放 | 国内成人综合 |