{"id":2158,"date":"2025-05-12T12:00:08","date_gmt":"2025-05-12T04:00:08","guid":{"rendered":"https:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/"},"modified":"2025-05-12T12:00:08","modified_gmt":"2025-05-12T04:00:08","slug":"%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5","status":"publish","type":"post","link":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/","title":{"rendered":"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875"},"content":{"rendered":"<div class=\"article_content clearfix\" id=\"article_content\">\n <link href=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/mdeditor\/css\/editerView\/kdoc_html_views-1a98987dfd.css\" rel=\"stylesheet\"\/>\n <link href=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/mdeditor\/css\/editerView\/ck_htmledit_views-704d5b9767.css\" rel=\"stylesheet\"\/>\n<div class=\"htmledit_views atom-one-dark\" id=\"content_views\">\n<p>\n   <span style=\"font-size:18px; color:#FF0000\"><br \/>\n    <strong><br \/>\n     1.\u81ea\u5b9a\u4e49View<br \/>\n    <\/strong><br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:18px\"><br \/>\n    <strong><br \/>\n     package sf.hmg.turntest;<\/p>\n<p>     import android.content.Context;<br \/>\n     <br \/>\n     import android.graphics.Bitmap;<br \/>\n     <br \/>\n     import android.graphics.BitmapFactory;<br \/>\n     <br \/>\n     import android.graphics.Canvas;<br \/>\n     <br \/>\n     import android.graphics.Color;<br \/>\n     <br \/>\n     import android.graphics.ColorMatrix;<br \/>\n     <br \/>\n     import android.graphics.ColorMatrixColorFilter;<br \/>\n     <br \/>\n     import android.graphics.Matrix;<br \/>\n     <br \/>\n     import android.graphics.Paint;<br \/>\n     <br \/>\n     import android.graphics.Path;<br \/>\n     <br \/>\n     import android.graphics.PointF;<br \/>\n     <br \/>\n     import android.graphics.Region;<br \/>\n     <br \/>\n     import android.graphics.drawable.GradientDrawable;<br \/>\n     <br \/>\n     import android.util.Log;<br \/>\n     <br \/>\n     import android.view.MotionEvent;<br \/>\n     <br \/>\n     import android.view.View;<\/p>\n<p>     public class PageWidget extends View {<br \/>\n     <!-- --><\/p>\n<p>     private static final String TAG = &#8220;hmg&#8221;;<br \/>\n     <br \/>\n     private int mWidth = 480;<br \/>\n     <br \/>\n     private int mHeight = 800;<br \/>\n     <br \/>\n     private int mCornerX = 0; \/\/ \u62d6\u62fd\u70b9\u5bf9\u5e94\u7684\u9875\u811a<br \/>\n     <br \/>\n     private int mCornerY = 0;<br \/>\n     <br \/>\n     private Path mPath0;<br \/>\n     <br \/>\n     private Path mPath1;<br \/>\n     <br \/>\n     Bitmap mCurPageBitmap = null; \/\/ \u5f53\u524d\u9875<br \/>\n     <br \/>\n     Bitmap mCurPageBackBitmap = null;<br \/>\n     <br \/>\n     Bitmap mNextPageBitmap = null;<\/p>\n<p>     PointF mTouch = new PointF(); \/\/ \u62d6\u62fd\u70b9<br \/>\n     <br \/>\n     PointF mBezierStart1 = new PointF(); \/\/ \u8d1d\u585e\u5c14\u66f2\u7ebf\u8d77\u59cb\u70b9<br \/>\n     <br \/>\n     PointF mBezierControl1 = new PointF(); \/\/ \u8d1d\u585e\u5c14\u66f2\u7ebf\u63a7\u5236\u70b9<br \/>\n     <br \/>\n     PointF mBeziervertex1 = new PointF(); \/\/ \u8d1d\u585e\u5c14\u66f2\u7ebf\u9876\u70b9<br \/>\n     <br \/>\n     PointF mBezierEnd1 = new PointF(); \/\/ \u8d1d\u585e\u5c14\u66f2\u7ebf\u7ed3\u675f\u70b9<\/p>\n<p>     PointF mBezierStart2 = new PointF(); \/\/ \u53e6\u4e00\u6761\u8d1d\u585e\u5c14\u66f2\u7ebf<br \/>\n     <br \/>\n     PointF mBezierControl2 = new PointF();<br \/>\n     <br \/>\n     PointF mBeziervertex2 = new PointF();<br \/>\n     <br \/>\n     PointF mBezierEnd2 = new PointF();<\/p>\n<p>     float mMiddleX;<br \/>\n     <br \/>\n     float mMiddleY;<br \/>\n     <br \/>\n     float mDegrees;<br \/>\n     <br \/>\n     float mTouchToCornerDis;<br \/>\n     <br \/>\n     ColorMatrixColorFilter mColorMatrixFilter;<br \/>\n     <br \/>\n     Matrix mMatrix;<br \/>\n     <br \/>\n     float[] mMatrixArray = { 0, 0, 0, 0, 0, 0, 0, 0, 1.0f };<\/p>\n<p>     boolean mIsRTandLB; \/\/ \u662f\u5426\u5c5e\u4e8e\u53f3\u4e0a\u5de6\u4e0b<br \/>\n     <br \/>\n     \/\/ for test<br \/>\n     <br \/>\n     float mMaxLength = (float) Math.hypot(480, 800);<br \/>\n     <br \/>\n     int[] mBackShadowColors;<br \/>\n     <br \/>\n     int[] mFrontShadowColors;<br \/>\n     <br \/>\n     GradientDrawable mBackShadowDrawableLR;<br \/>\n     <br \/>\n     GradientDrawable mBackShadowDrawableRL;<br \/>\n     <br \/>\n     GradientDrawable mFolderShadowDrawableLR;<br \/>\n     <br \/>\n     GradientDrawable mFolderShadowDrawableRL;<\/p>\n<p>     GradientDrawable mFrontShadowDrawableHBT;<br \/>\n     <br \/>\n     GradientDrawable mFrontShadowDrawableHTB;<br \/>\n     <br \/>\n     GradientDrawable mFrontShadowDrawableVLR;<br \/>\n     <br \/>\n     GradientDrawable mFrontShadowDrawableVRL;<\/p>\n<p>     private Bitmap mBitmap;<br \/>\n     <br \/>\n     private Canvas mCanvas;<br \/>\n     <br \/>\n     private Paint mBitmapPaint;<br \/>\n     <br \/>\n     Paint paint;<\/p>\n<p>     Paint mPaint;<\/p>\n<p>     public PageWidget(Context context) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     super(context);<br \/>\n     <br \/>\n     \/\/ TODO Auto-generated constructor stub<br \/>\n     <br \/>\n     mPath0 = new Path();<br \/>\n     <br \/>\n     mPath1 = new Path();<br \/>\n     <br \/>\n     createDrawable();<\/p>\n<p>     \/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n     <br \/>\n     mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);<\/p>\n<p>     mCanvas = new Canvas(mBitmap);<br \/>\n     <br \/>\n     mBitmapPaint = new Paint(Paint.DITHER_FLAG);<\/p>\n<p>     paint = new Paint();<br \/>\n     <br \/>\n     mPaint = new Paint();<br \/>\n     <br \/>\n     mPaint.setStyle(Paint.Style.FILL);<\/p>\n<p>     mCurPageBitmap = BitmapFactory.decodeResource(this.getResources(),<br \/>\n     <br \/>\n     R.drawable.page1);<br \/>\n     <br \/>\n     mNextPageBitmap = BitmapFactory.decodeResource(this.getResources(),<br \/>\n     <br \/>\n     R.drawable.page2);<\/p>\n<p>     ColorMatrix cm = new ColorMatrix();<br \/>\n     <br \/>\n     float array[] = { 0.55f, 0, 0, 0, 80.0f, 0, 0.55f, 0, 0, 80.0f, 0, 0,<br \/>\n     <br \/>\n     0.55f, 0, 80.0f, 0, 0, 0, 0.2f, 0 };<br \/>\n     <br \/>\n     cm.set(array);<br \/>\n     <br \/>\n     mColorMatrixFilter = new ColorMatrixColorFilter(cm);<\/p>\n<p>     mMatrix = new Matrix();<br \/>\n     <br \/>\n     }<\/p>\n<p>     \/**<br \/>\n     <br \/>\n     * Author : hmg25 Version: 1.0 Description : \u8ba1\u7b97\u62d6\u62fd\u70b9\u5bf9\u5e94\u7684\u62d6\u62fd\u811a<br \/>\n     <br \/>\n     *\/<br \/>\n     <br \/>\n     private void calcCornerXY(float x, float y) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     if (x &lt;= mWidth \/ 2)<br \/>\n     <br \/>\n     mCornerX = 0;<br \/>\n     <br \/>\n     else<br \/>\n     <br \/>\n     mCornerX = mWidth;<br \/>\n     <br \/>\n     if (y &lt;= mHeight \/ 2)<br \/>\n     <br \/>\n     mCornerY = 0;<br \/>\n     <br \/>\n     else<br \/>\n     <br \/>\n     mCornerY = mHeight;<br \/>\n     <br \/>\n     if ((mCornerX == 0 &amp;&amp; mCornerY == mHeight)<br \/>\n     <br \/>\n     || (mCornerX == mWidth &amp;&amp; mCornerY == 0))<br \/>\n     <br \/>\n     mIsRTandLB = true;<br \/>\n     <br \/>\n     else<br \/>\n     <br \/>\n     mIsRTandLB = false;<br \/>\n     <br \/>\n     }<\/p>\n<p>     @Override<br \/>\n     <br \/>\n     public boolean onTouchEvent(MotionEvent event) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     \/\/ TODO Auto-generated method stub<br \/>\n     <br \/>\n     if (event.getAction() == MotionEvent.ACTION_MOVE) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mCanvas.drawColor(0xFFAAAAAA);<br \/>\n     <br \/>\n     mTouch.x = event.getX();<br \/>\n     <br \/>\n     mTouch.y = event.getY();<br \/>\n     <br \/>\n     this.postInvalidate();<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     if (event.getAction() == MotionEvent.ACTION_DOWN) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mCanvas.drawColor(0xFFAAAAAA);<br \/>\n     <br \/>\n     mTouch.x = event.getX();<br \/>\n     <br \/>\n     mTouch.y = event.getY();<br \/>\n     <br \/>\n     calcCornerXY(mTouch.x, mTouch.y);<br \/>\n     <br \/>\n     this.postInvalidate();<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     if (event.getAction() == MotionEvent.ACTION_UP) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mCanvas.drawColor(0xFFAAAAAA);<br \/>\n     <br \/>\n     mTouch.x = mCornerX;<br \/>\n     <br \/>\n     mTouch.y = mCornerY;<br \/>\n     <br \/>\n     this.postInvalidate();<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     \/\/ return super.onTouchEvent(event);<br \/>\n     <br \/>\n     return true;<br \/>\n     <br \/>\n     }<\/p>\n<p>     \/**<br \/>\n     <br \/>\n     * Author : hmg25 Version: 1.0 Description : \u6c42\u89e3\u76f4\u7ebfP1P2\u548c\u76f4\u7ebfP3P4\u7684\u4ea4\u70b9\u5750\u6807<br \/>\n     <br \/>\n     *\/<br \/>\n     <br \/>\n     public PointF getCross(PointF P1, PointF P2, PointF P3, PointF P4) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     PointF CrossP = new PointF();<br \/>\n     <br \/>\n     \/\/ \u4e8c\u5143\u51fd\u6570\u901a\u5f0f\uff1a y=ax+b<br \/>\n     <br \/>\n     float a1 = (P2.y &#8211; P1.y) \/ (P2.x &#8211; P1.x);<br \/>\n     <br \/>\n     float b1 = ((P1.x * P2.y) &#8211; (P2.x * P1.y)) \/ (P1.x &#8211; P2.x);<\/p>\n<p>     float a2 = (P4.y &#8211; P3.y) \/ (P4.x &#8211; P3.x);<br \/>\n     <br \/>\n     float b2 = ((P3.x * P4.y) &#8211; (P4.x * P3.y)) \/ (P3.x &#8211; P4.x);<br \/>\n     <br \/>\n     CrossP.x = (b2 &#8211; b1) \/ (a1 &#8211; a2);<br \/>\n     <br \/>\n     CrossP.y = a1 * CrossP.x + b1;<br \/>\n     <br \/>\n     return CrossP;<br \/>\n     <br \/>\n     }<\/p>\n<p>     private void calcPoints() {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mMiddleX = (mTouch.x + mCornerX) \/ 2;<br \/>\n     <br \/>\n     mMiddleY = (mTouch.y + mCornerY) \/ 2;<br \/>\n     <br \/>\n     mBezierControl1.x = mMiddleX &#8211; (mCornerY &#8211; mMiddleY)<br \/>\n     <br \/>\n     * (mCornerY &#8211; mMiddleY) \/ (mCornerX &#8211; mMiddleX);<br \/>\n     <br \/>\n     mBezierControl1.y = mCornerY;<br \/>\n     <br \/>\n     mBezierControl2.x = mCornerX;<br \/>\n     <br \/>\n     mBezierControl2.y = mMiddleY &#8211; (mCornerX &#8211; mMiddleX)<br \/>\n     <br \/>\n     * (mCornerX &#8211; mMiddleX) \/ (mCornerY &#8211; mMiddleY);<\/p>\n<p>     Log.i(&#8220;hmg&#8221;, &#8220;mTouchX\u00a0 &#8221; + mTouch.x + &#8221;\u00a0 mTouchY\u00a0 &#8221; + mTouch.y);<br \/>\n     <br \/>\n     Log.i(&#8220;hmg&#8221;, &#8220;mBezierControl1.x\u00a0 &#8221; + mBezierControl1.x<br \/>\n     <br \/>\n     + &#8221;\u00a0 mBezierControl1.y\u00a0 &#8221; + mBezierControl1.y);<br \/>\n     <br \/>\n     Log.i(&#8220;hmg&#8221;, &#8220;mBezierControl2.x\u00a0 &#8221; + mBezierControl2.x<br \/>\n     <br \/>\n     + &#8221;\u00a0 mBezierControl2.y\u00a0 &#8221; + mBezierControl2.y);<\/p>\n<p>     mBezierStart1.x = mBezierControl1.x &#8211; (mCornerX &#8211; mBezierControl1.x)<br \/>\n     <br \/>\n     \/ 2;<br \/>\n     <br \/>\n     mBezierStart1.y = mCornerY;<\/p>\n<p>     \/\/ \u5f53mBezierStart1.x &lt; 0\u6216\u8005mBezierStart1.x &gt; 480\u65f6<br \/>\n     <br \/>\n     \/\/ \u5982\u679c\u7ee7\u7eed\u7ffb\u9875\uff0c\u4f1a\u51fa\u73b0BUG\u6545\u5728\u6b64\u9650\u5236<br \/>\n     <br \/>\n     if (mBezierStart1.x &lt; 0 || mBezierStart1.x &gt; 480) {<br \/>\n     <br \/>\n     if (mBezierStart1.x &lt; 0)<br \/>\n     <br \/>\n     mBezierStart1.x = mWidth &#8211; mBezierStart1.x;<\/p>\n<p>     float f1 = Math.abs(mCornerX &#8211; mTouch.x);<br \/>\n     <br \/>\n     float f2 = mWidth * f1 \/ mBezierStart1.x;<br \/>\n     <br \/>\n     mTouch.x = Math.abs(mCornerX &#8211; f2);<\/p>\n<p>     float f3 = Math.abs(mCornerX &#8211; mTouch.x)<br \/>\n     <br \/>\n     * Math.abs(mCornerY &#8211; mTouch.y) \/ f1;<br \/>\n     <br \/>\n     mTouch.y = Math.abs(mCornerY &#8211; f3);<br \/>\n     <br \/>\n     mMiddleX = (mTouch.x + mCornerX) \/ 2;<br \/>\n     <br \/>\n     mMiddleY = (mTouch.y + mCornerY) \/ 2;<\/p>\n<p>     mBezierControl1.x = mMiddleX &#8211; (mCornerY &#8211; mMiddleY)<br \/>\n     <br \/>\n     * (mCornerY &#8211; mMiddleY) \/ (mCornerX &#8211; mMiddleX);<br \/>\n     <br \/>\n     mBezierControl1.y = mCornerY;<\/p>\n<p>     mBezierControl2.x = mCornerX;<br \/>\n     <br \/>\n     mBezierControl2.y = mMiddleY &#8211; (mCornerX &#8211; mMiddleX)<br \/>\n     <br \/>\n     * (mCornerX &#8211; mMiddleX) \/ (mCornerY &#8211; mMiddleY);<br \/>\n     <br \/>\n     Log.i(&#8220;hmg&#8221;, &#8220;mTouchX &#8211;&gt; &#8221; + mTouch.x + &#8221;\u00a0 mTouchY&#8211;&gt;\u00a0 &#8221;<br \/>\n     <br \/>\n     + mTouch.y);<br \/>\n     <br \/>\n     Log.i(&#8220;hmg&#8221;, &#8220;mBezierControl1.x&#8211;\u00a0 &#8221; + mBezierControl1.x<br \/>\n     <br \/>\n     + &#8221;\u00a0 mBezierControl1.y &#8212; &#8221; + mBezierControl1.y);<br \/>\n     <br \/>\n     Log.i(&#8220;hmg&#8221;, &#8220;mBezierControl2.x &#8212; &#8221; + mBezierControl2.x<br \/>\n     <br \/>\n     + &#8221;\u00a0 mBezierControl2.y &#8212; &#8221; + mBezierControl2.y);<br \/>\n     <br \/>\n     mBezierStart1.x = mBezierControl1.x<br \/>\n     <br \/>\n     &#8211; (mCornerX &#8211; mBezierControl1.x) \/ 2;<br \/>\n     <br \/>\n     }<\/p>\n<p>     mBezierStart2.x = mCornerX;<br \/>\n     <br \/>\n     mBezierStart2.y = mBezierControl2.y &#8211; (mCornerY &#8211; mBezierControl2.y)<br \/>\n     <br \/>\n     \/ 2;<\/p>\n<p>     mTouchToCornerDis = (float) Math.hypot((mTouch.x &#8211; mCornerX),<br \/>\n     <br \/>\n     (mTouch.y &#8211; mCornerY));<\/p>\n<p>     mBezierEnd1 = getCross(mTouch, mBezierControl1, mBezierStart1,<br \/>\n     <br \/>\n     mBezierStart2);<br \/>\n     <br \/>\n     mBezierEnd2 = getCross(mTouch, mBezierControl2, mBezierStart1,<br \/>\n     <br \/>\n     mBezierStart2);<\/p>\n<p>     Log.i(&#8220;hmg&#8221;, &#8220;mBezierEnd1.x\u00a0 &#8221; + mBezierEnd1.x + &#8221;\u00a0 mBezierEnd1.y\u00a0 &#8221;<br \/>\n     <br \/>\n     + mBezierEnd1.y);<br \/>\n     <br \/>\n     Log.i(&#8220;hmg&#8221;, &#8220;mBezierEnd2.x\u00a0 &#8221; + mBezierEnd2.x + &#8221;\u00a0 mBezierEnd2.y\u00a0 &#8221;<br \/>\n     <br \/>\n     + mBezierEnd2.y);<\/p>\n<p>     \/*<br \/>\n     <br \/>\n     * mBeziervertex1.x \u63a8\u5bfc<br \/>\n     <br \/>\n     * ((mBezierStart1.x+mBezierEnd1.x)\/2+mBezierControl1.x)\/2 \u5316\u7b80\u7b49\u4ef7\u4e8e<br \/>\n     <br \/>\n     * (mBezierStart1.x+ 2*mBezierControl1.x+mBezierEnd1.x) \/ 4<br \/>\n     <br \/>\n     *\/<br \/>\n     <br \/>\n     mBeziervertex1.x = (mBezierStart1.x + 2 * mBezierControl1.x + mBezierEnd1.x) \/ 4;<br \/>\n     <br \/>\n     mBeziervertex1.y = (2 * mBezierControl1.y + mBezierStart1.y + mBezierEnd1.y) \/ 4;<br \/>\n     <br \/>\n     mBeziervertex2.x = (mBezierStart2.x + 2 * mBezierControl2.x + mBezierEnd2.x) \/ 4;<br \/>\n     <br \/>\n     mBeziervertex2.y = (2 * mBezierControl2.y + mBezierStart2.y + mBezierEnd2.y) \/ 4;<br \/>\n     <br \/>\n     }<\/p>\n<p>     private void drawCurrentPageArea(Canvas canvas, Bitmap bitmap, Path path) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mPath0.reset();<br \/>\n     <br \/>\n     mPath0.moveTo(mBezierStart1.x, mBezierStart1.y);<br \/>\n     <br \/>\n     mPath0.quadTo(mBezierControl1.x, mBezierControl1.y, mBezierEnd1.x,<br \/>\n     <br \/>\n     mBezierEnd1.y);<br \/>\n     <br \/>\n     mPath0.lineTo(mTouch.x, mTouch.y);<br \/>\n     <br \/>\n     mPath0.lineTo(mBezierEnd2.x, mBezierEnd2.y);<br \/>\n     <br \/>\n     mPath0.quadTo(mBezierControl2.x, mBezierControl2.y, mBezierStart2.x,<br \/>\n     <br \/>\n     mBezierStart2.y);<br \/>\n     <br \/>\n     mPath0.lineTo(mCornerX, mCornerY);<br \/>\n     <br \/>\n     mPath0.close();<\/p>\n<p>     canvas.save();<br \/>\n     <br \/>\n     canvas.clipPath(path, Region.Op.XOR);<br \/>\n     <br \/>\n     canvas.drawBitmap(bitmap, 0, 0, null);<br \/>\n     <br \/>\n     canvas.restore();<br \/>\n     <br \/>\n     }<\/p>\n<p>     private void drawNextPageAreaAndShadow(Canvas canvas, Bitmap bitmap) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mPath1.reset();<br \/>\n     <br \/>\n     mPath1.moveTo(mBezierStart1.x, mBezierStart1.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBeziervertex1.x, mBeziervertex1.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBeziervertex2.x, mBeziervertex2.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierStart2.x, mBezierStart2.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mCornerX, mCornerY);<br \/>\n     <br \/>\n     mPath1.close();<\/p>\n<p>     mDegrees = (float) Math.toDegrees(Math.atan2(mBezierControl1.x<br \/>\n     <br \/>\n     &#8211; mCornerX, mBezierControl2.y &#8211; mCornerY));<br \/>\n     <br \/>\n     int leftx;<br \/>\n     <br \/>\n     int rightx;<br \/>\n     <br \/>\n     GradientDrawable mBackShadowDrawable;<br \/>\n     <br \/>\n     if (mIsRTandLB) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     leftx = (int) (mBezierStart1.x);<br \/>\n     <br \/>\n     rightx = (int) (mBezierStart1.x + mTouchToCornerDis \/ 4);<br \/>\n     <br \/>\n     mBackShadowDrawable = mBackShadowDrawableLR;<br \/>\n     <br \/>\n     } else {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     leftx = (int) (mBezierStart1.x &#8211; mTouchToCornerDis \/ 4);<br \/>\n     <br \/>\n     rightx = (int) mBezierStart1.x;<br \/>\n     <br \/>\n     mBackShadowDrawable = mBackShadowDrawableRL;<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     canvas.save();<br \/>\n     <br \/>\n     canvas.clipPath(mPath0);<br \/>\n     <br \/>\n     canvas.clipPath(mPath1, Region.Op.INTERSECT);<br \/>\n     <br \/>\n     canvas.drawBitmap(bitmap, 0, 0, null);<br \/>\n     <br \/>\n     canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y);<br \/>\n     <br \/>\n     mBackShadowDrawable.setBounds(leftx, (int) mBezierStart1.y, rightx,<br \/>\n     <br \/>\n     (int) (mMaxLength + mBezierStart1.y));<br \/>\n     <br \/>\n     mBackShadowDrawable.draw(canvas);<br \/>\n     <br \/>\n     canvas.restore();<br \/>\n     <br \/>\n     }<\/p>\n<p>     public void setBitmaps(Bitmap bm1, Bitmap bm2, Bitmap bm3) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     mCurPageBitmap = bm1;<br \/>\n     <br \/>\n     mCurPageBackBitmap = bm2;<br \/>\n     <br \/>\n     mNextPageBitmap = bm3;<br \/>\n     <br \/>\n     }<\/p>\n<p>     @Override<br \/>\n     <br \/>\n     protected void onDraw(Canvas canvas) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     canvas.drawColor(0xFFAAAAAA);<br \/>\n     <br \/>\n     calcPoints();<br \/>\n     <br \/>\n     drawCurrentPageArea(mCanvas, mCurPageBitmap, mPath0);<br \/>\n     <br \/>\n     drawNextPageAreaAndShadow(mCanvas, mNextPageBitmap);<br \/>\n     <br \/>\n     drawCurrentPageShadow(mCanvas);<br \/>\n     <br \/>\n     drawCurrentBackArea(mCanvas, mCurPageBitmap);<br \/>\n     <br \/>\n     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);<br \/>\n     <br \/>\n     }<\/p>\n<p>     \/**<br \/>\n     <br \/>\n     * Author : hmg25 Version: 1.0 Description : \u521b\u5efa\u9634\u5f71\u7684GradientDrawable<br \/>\n     <br \/>\n     *\/<br \/>\n     <br \/>\n     private void createDrawable() {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     int[] color = { 0x333333, 0xb0333333 };<br \/>\n     <br \/>\n     mFolderShadowDrawableRL = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.RIGHT_LEFT, color);<br \/>\n     <br \/>\n     mFolderShadowDrawableRL<br \/>\n     <br \/>\n     .setGradientType(GradientDrawable.LINEAR_GRADIENT);<\/p>\n<p>     mFolderShadowDrawableLR = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.LEFT_RIGHT, color);<br \/>\n     <br \/>\n     mFolderShadowDrawableLR<br \/>\n     <br \/>\n     .setGradientType(GradientDrawable.LINEAR_GRADIENT);<\/p>\n<p>     mBackShadowColors = new int[] { 0xff111111, 0x111111 };<br \/>\n     <br \/>\n     mBackShadowDrawableRL = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.RIGHT_LEFT, mBackShadowColors);<br \/>\n     <br \/>\n     mBackShadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT);<\/p>\n<p>     mBackShadowDrawableLR = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors);<br \/>\n     <br \/>\n     mBackShadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT);<\/p>\n<p>     mFrontShadowColors = new int[] { 0x80111111, 0x111111 };<br \/>\n     <br \/>\n     mFrontShadowDrawableVLR = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.LEFT_RIGHT, mFrontShadowColors);<br \/>\n     <br \/>\n     mFrontShadowDrawableVLR<br \/>\n     <br \/>\n     .setGradientType(GradientDrawable.LINEAR_GRADIENT);<br \/>\n     <br \/>\n     mFrontShadowDrawableVRL = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.RIGHT_LEFT, mFrontShadowColors);<br \/>\n     <br \/>\n     mFrontShadowDrawableVRL<br \/>\n     <br \/>\n     .setGradientType(GradientDrawable.LINEAR_GRADIENT);<\/p>\n<p>     mFrontShadowDrawableHTB = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.TOP_BOTTOM, mFrontShadowColors);<br \/>\n     <br \/>\n     mFrontShadowDrawableHTB<br \/>\n     <br \/>\n     .setGradientType(GradientDrawable.LINEAR_GRADIENT);<\/p>\n<p>     mFrontShadowDrawableHBT = new GradientDrawable(<br \/>\n     <br \/>\n     GradientDrawable.Orientation.BOTTOM_TOP, mFrontShadowColors);<br \/>\n     <br \/>\n     mFrontShadowDrawableHBT<br \/>\n     <br \/>\n     .setGradientType(GradientDrawable.LINEAR_GRADIENT);<br \/>\n     <br \/>\n     }<\/p>\n<p>     \/**<br \/>\n     <br \/>\n     * Author : hmg25 Version: 1.0 Description : \u7ed8\u5236\u7ffb\u8d77\u9875\u7684\u9634\u5f71<br \/>\n     <br \/>\n     *\/<br \/>\n     <br \/>\n     public void drawCurrentPageShadow(Canvas canvas) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     double degree;<br \/>\n     <br \/>\n     if (mIsRTandLB) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     degree = Math.PI<br \/>\n     <br \/>\n     \/ 4<br \/>\n     <br \/>\n     &#8211; Math.atan2(mBezierControl1.y &#8211; mTouch.y, mTouch.x<br \/>\n     <br \/>\n     &#8211; mBezierControl1.x);<br \/>\n     <br \/>\n     } else {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     degree = Math.PI<br \/>\n     <br \/>\n     \/ 4<br \/>\n     <br \/>\n     &#8211; Math.atan2(mTouch.y &#8211; mBezierControl1.y, mTouch.x<br \/>\n     <br \/>\n     &#8211; mBezierControl1.x);<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     \/\/\u7ffb\u8d77\u9875\u9634\u5f71\u9876\u70b9\u4e0etouch\u70b9\u7684\u8ddd\u79bb<br \/>\n     <br \/>\n     double d1 = (float) 25 * 1.414 * Math.cos(degree);<br \/>\n     <br \/>\n     double d2 = (float) 25 * 1.414 * Math.sin(degree);<br \/>\n     <br \/>\n     float x = (float) (mTouch.x + d1);<br \/>\n     <br \/>\n     float y;<br \/>\n     <br \/>\n     if (mIsRTandLB) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     y = (float) (mTouch.y + d2);<br \/>\n     <br \/>\n     } else {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     y = (float) (mTouch.y &#8211; d2);<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     mPath1.reset();<br \/>\n     <br \/>\n     mPath1.moveTo(x, y);<br \/>\n     <br \/>\n     mPath1.lineTo(mTouch.x, mTouch.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierControl1.x, mBezierControl1.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierStart1.x, mBezierStart1.y);<br \/>\n     <br \/>\n     mPath1.close();<br \/>\n     <br \/>\n     float rotateDegrees;<br \/>\n     <br \/>\n     canvas.save();<\/p>\n<p>     canvas.clipPath(mPath0, Region.Op.XOR);<br \/>\n     <br \/>\n     canvas.clipPath(mPath1, Region.Op.INTERSECT);<br \/>\n     <br \/>\n     int leftx;<br \/>\n     <br \/>\n     int rightx;<br \/>\n     <br \/>\n     GradientDrawable mCurrentPageShadow;<br \/>\n     <br \/>\n     if (mIsRTandLB) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     leftx = (int) (mBezierControl1.x);<br \/>\n     <br \/>\n     rightx = (int) mBezierControl1.x + 25;<br \/>\n     <br \/>\n     mCurrentPageShadow = mFrontShadowDrawableVLR;<br \/>\n     <br \/>\n     } else {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     leftx = (int) (mBezierControl1.x &#8211; 25);<br \/>\n     <br \/>\n     rightx = (int) mBezierControl1.x + 1;<br \/>\n     <br \/>\n     mCurrentPageShadow = mFrontShadowDrawableVRL;<br \/>\n     <br \/>\n     }<\/p>\n<p>     rotateDegrees = (float) Math.toDegrees(Math.atan2(mTouch.x<br \/>\n     <br \/>\n     &#8211; mBezierControl1.x, mBezierControl1.y &#8211; mTouch.y));<br \/>\n     <br \/>\n     canvas.rotate(rotateDegrees, mBezierControl1.x, mBezierControl1.y);<br \/>\n     <br \/>\n     mCurrentPageShadow.setBounds(leftx,<br \/>\n     <br \/>\n     (int) (mBezierControl1.y &#8211; mMaxLength), rightx,<br \/>\n     <br \/>\n     (int) (mBezierControl1.y));<br \/>\n     <br \/>\n     mCurrentPageShadow.draw(canvas);<br \/>\n     <br \/>\n     canvas.restore();<\/p>\n<p>     mPath1.reset();<br \/>\n     <br \/>\n     mPath1.moveTo(x, y);<br \/>\n     <br \/>\n     mPath1.lineTo(mTouch.x, mTouch.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierControl2.x, mBezierControl2.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierStart2.x, mBezierStart2.y);<br \/>\n     <br \/>\n     mPath1.close();<br \/>\n     <br \/>\n     canvas.save();<br \/>\n     <br \/>\n     canvas.clipPath(mPath0, Region.Op.XOR);<br \/>\n     <br \/>\n     canvas.clipPath(mPath1, Region.Op.INTERSECT);<br \/>\n     <br \/>\n     if (mIsRTandLB) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     leftx = (int) (mBezierControl2.y);<br \/>\n     <br \/>\n     rightx = (int) (mBezierControl2.y + 25);<br \/>\n     <br \/>\n     mCurrentPageShadow = mFrontShadowDrawableHTB;<br \/>\n     <br \/>\n     } else {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     leftx = (int) (mBezierControl2.y &#8211; 25);<br \/>\n     <br \/>\n     rightx = (int) (mBezierControl2.y + 1);<br \/>\n     <br \/>\n     mCurrentPageShadow = mFrontShadowDrawableHBT;<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     rotateDegrees = (float) Math.toDegrees(Math.atan2(mBezierControl2.y<br \/>\n     <br \/>\n     &#8211; mTouch.y, mBezierControl2.x &#8211; mTouch.x));<br \/>\n     <br \/>\n     canvas.rotate(rotateDegrees, mBezierControl2.x, mBezierControl2.y);<br \/>\n     <br \/>\n     float temp;<br \/>\n     <br \/>\n     if (mBezierControl2.y &lt; 0)<br \/>\n     <br \/>\n     temp = mBezierControl2.y &#8211; 800;<br \/>\n     <br \/>\n     else<br \/>\n     <br \/>\n     temp = mBezierControl2.y;<\/p>\n<p>     int hmg = (int) Math.hypot(mBezierControl2.x, temp);<br \/>\n     <br \/>\n     if (hmg &gt; mMaxLength)<br \/>\n     <br \/>\n     mCurrentPageShadow<br \/>\n     <br \/>\n     .setBounds((int) (mBezierControl2.x &#8211; 25) &#8211; hmg, leftx,<br \/>\n     <br \/>\n     (int) (mBezierControl2.x + mMaxLength) &#8211; hmg,<br \/>\n     <br \/>\n     rightx);<br \/>\n     <br \/>\n     else<br \/>\n     <br \/>\n     mCurrentPageShadow.setBounds(<br \/>\n     <br \/>\n     (int) (mBezierControl2.x &#8211; mMaxLength), leftx,<br \/>\n     <br \/>\n     (int) (mBezierControl2.x), rightx);<\/p>\n<p>     Log.i(&#8220;hmg&#8221;, &#8220;mBezierControl2.x\u00a0\u00a0 &#8221; + mBezierControl2.x<br \/>\n     <br \/>\n     + &#8221;\u00a0 mBezierControl2.y\u00a0 &#8221; + mBezierControl2.y);<br \/>\n     <br \/>\n     mCurrentPageShadow.draw(canvas);<br \/>\n     <br \/>\n     canvas.restore();<br \/>\n     <br \/>\n     }<\/p>\n<p>     \/**<br \/>\n     <br \/>\n     * Author : hmg25 Version: 1.0 Description : \u7ed8\u5236\u7ffb\u8d77\u9875\u80cc\u9762<br \/>\n     <br \/>\n     *\/<br \/>\n     <br \/>\n     private void drawCurrentBackArea(Canvas canvas, Bitmap bitmap) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     int i = (int) (mBezierStart1.x + mBezierControl1.x) \/ 2;<br \/>\n     <br \/>\n     float f1 = Math.abs(i &#8211; mBezierControl1.x);<br \/>\n     <br \/>\n     int i1 = (int) (mBezierStart2.y + mBezierControl2.y) \/ 2;<br \/>\n     <br \/>\n     float f2 = Math.abs(i1 &#8211; mBezierControl2.y);<br \/>\n     <br \/>\n     float f3 = Math.min(f1, f2);<br \/>\n     <br \/>\n     mPath1.reset();<br \/>\n     <br \/>\n     mPath1.moveTo(mBeziervertex2.x, mBeziervertex2.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBeziervertex1.x, mBeziervertex1.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierEnd1.x, mBezierEnd1.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mTouch.x, mTouch.y);<br \/>\n     <br \/>\n     mPath1.lineTo(mBezierEnd2.x, mBezierEnd2.y);<br \/>\n     <br \/>\n     mPath1.close();<br \/>\n     <br \/>\n     GradientDrawable mFolderShadowDrawable;<br \/>\n     <br \/>\n     int left;<br \/>\n     <br \/>\n     int right;<br \/>\n     <br \/>\n     if (mIsRTandLB) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     left = (int) (mBezierStart1.x &#8211; 1);<br \/>\n     <br \/>\n     right = (int) (mBezierStart1.x + f3 + 1);<br \/>\n     <br \/>\n     mFolderShadowDrawable = mFolderShadowDrawableLR;<br \/>\n     <br \/>\n     } else {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     left= (int) (mBezierStart1.x &#8211; f3 &#8211; 1);<br \/>\n     <br \/>\n     right= (int) (mBezierStart1.x + 1);<br \/>\n     <br \/>\n     mFolderShadowDrawable = mFolderShadowDrawableRL;<br \/>\n     <br \/>\n     }<br \/>\n     <br \/>\n     canvas.save();<br \/>\n     <br \/>\n     canvas.clipPath(mPath0);<br \/>\n     <br \/>\n     canvas.clipPath(mPath1, Region.Op.INTERSECT);<\/p>\n<p>     mPaint.setColorFilter(mColorMatrixFilter);<\/p>\n<p>     float dis = (float) Math.hypot(mCornerX &#8211; mBezierControl1.x,<br \/>\n     <br \/>\n     mBezierControl2.y &#8211; mCornerY);<br \/>\n     <br \/>\n     float f8 = (mCornerX &#8211; mBezierControl1.x) \/ dis;<br \/>\n     <br \/>\n     float f9 = (mBezierControl2.y &#8211; mCornerY) \/ dis;<br \/>\n     <br \/>\n     mMatrixArray[0] = 1 &#8211; 2 * f9 * f9;<br \/>\n     <br \/>\n     mMatrixArray[1] = 2 * f8 * f9;<br \/>\n     <br \/>\n     mMatrixArray[3] = mMatrixArray[1];<br \/>\n     <br \/>\n     mMatrixArray[4] = 1 &#8211; 2 * f8 * f8;<br \/>\n     <br \/>\n     mMatrix.reset();<br \/>\n     <br \/>\n     mMatrix.setValues(mMatrixArray);<br \/>\n     <br \/>\n     mMatrix.preTranslate(-mBezierControl1.x, -mBezierControl1.y);<br \/>\n     <br \/>\n     mMatrix.postTranslate(mBezierControl1.x, mBezierControl1.y);<br \/>\n     <br \/>\n     canvas.drawBitmap(bitmap, mMatrix, mPaint);<br \/>\n     <br \/>\n     \/\/ canvas.drawBitmap(bitmap, mMatrix, null);<br \/>\n     <br \/>\n     mPaint.setColorFilter(null);<br \/>\n     <br \/>\n     canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y);<br \/>\n     <br \/>\n     mFolderShadowDrawable.setBounds(left, (int) mBezierStart1.y, right,<br \/>\n     <br \/>\n     (int) (mBezierStart1.y + mMaxLength));<br \/>\n     <br \/>\n     mFolderShadowDrawable.draw(canvas);<br \/>\n     <br \/>\n     canvas.restore();<br \/>\n     <br \/>\n     }<\/p>\n<p>     }<br \/>\n     <br \/>\n     <span style=\"font-size:24px; color:#FF0000\"><br \/>\n      Activity \u4e0d\u7528\u5199\u5e03\u5c40<br \/>\n     <\/span><br \/>\n    <\/strong><br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:24px; color:#FF0000\"><br \/>\n    <strong><br \/>\n     \u76f4\u63a5\u7ed9<br \/>\n    <\/strong><br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:18px\"><br \/>\n    <strong><br \/>\n     package sf.hmg.turntest;<\/p>\n<p>     import android.app.Activity;<br \/>\n     <br \/>\n     import android.graphics.Paint;<br \/>\n     <br \/>\n     import android.os.Bundle;<br \/>\n     <br \/>\n     import android.view.Window;<br \/>\n     <br \/>\n     import android.view.WindowManager;<\/p>\n<p>     public class turntest extends Activity {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     \/** Called when the activity is first created. *\/<br \/>\n     <br \/>\n     private Paint mPaint;<br \/>\n     <br \/>\n     @Override<br \/>\n     <br \/>\n     public void onCreate(Bundle savedInstanceState) {<br \/>\n     <!-- --><br \/>\n     <br \/>\n     super.onCreate(savedInstanceState);<br \/>\n     <br \/>\n     \/\/\u65e0\u6807\u9898\u680f<br \/>\n     <br \/>\n     requestWindowFeature(Window.FEATURE_NO_TITLE);<br \/>\n     <br \/>\n     \/\/\u5e03\u5c40<br \/>\n     <br \/>\n     getWindow().setFlags(<br \/>\n     <br \/>\n     WindowManager.LayoutParams.FLAG_FULLSCREEN,<br \/>\n     <br \/>\n     WindowManager.LayoutParams.FLAG_FULLSCREEN);<br \/>\n     <br \/>\n     setContentView(new PageWidget(this));<\/p>\n<p>     }<\/p>\n<p>     }<br \/>\n     <br \/>\n    <\/strong><br \/>\n   <\/span>\n  <\/p>\n<\/p><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>1.\u81ea\u5b9a\u4e49View package sf.hmg.turntest; import android.conte [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":215,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-2158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-17"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\" \/>\n<meta property=\"og:description\" content=\"1.\u81ea\u5b9a\u4e49View package sf.hmg.turntest; import android.conte [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875\/\" \/>\n<meta property=\"og:site_name\" content=\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-12T04:00:08+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"260\" \/>\n\t<meta property=\"og:image:height\" content=\"180\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin@wunen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin@wunen\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/\"},\"author\":{\"name\":\"admin@wunen\",\"@id\":\"https:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8\"},\"headline\":\"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875\",\"datePublished\":\"2025-05-12T04:00:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/\"},\"wordCount\":1845,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.wunen.com\/#organization\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"articleSection\":[\"\u56fe\u4e66\u9605\u8bfb\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/\",\"url\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/\",\"name\":\"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"isPartOf\":{\"@id\":\"https:\/\/www.wunen.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"datePublished\":\"2025-05-12T04:00:08+00:00\",\"breadcrumb\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage\",\"url\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"contentUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"width\":260,\"height\":180},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wunen.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wunen.com\/#website\",\"url\":\"https:\/\/www.wunen.com\/\",\"name\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"description\":\"\u8f6f\u4ef6\u8d44\u8baf\u6765\u7269\u5ae9\",\"publisher\":{\"@id\":\"https:\/\/www.wunen.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wunen.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.wunen.com\/#organization\",\"name\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"url\":\"https:\/\/www.wunen.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wunen.com\/#\/schema\/logo\/image\/\",\"url\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png\",\"contentUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png\",\"width\":1024,\"height\":1024,\"caption\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\"},\"image\":{\"@id\":\"https:\/\/www.wunen.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8\",\"name\":\"admin@wunen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wunen.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g\",\"caption\":\"admin@wunen\"},\"sameAs\":[\"http:\/\/www.wunen.com\"],\"url\":\"http:\/\/www.wunen.com\/index.php\/author\/adminwunen\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875\/","og_locale":"zh_CN","og_type":"article","og_title":"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","og_description":"1.\u81ea\u5b9a\u4e49View package sf.hmg.turntest; import android.conte [&hellip;]","og_url":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875\/","og_site_name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","article_published_time":"2025-05-12T04:00:08+00:00","og_image":[{"width":260,"height":180,"url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","type":"image\/jpeg"}],"author":"admin@wunen","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin@wunen","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"9 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#article","isPartOf":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/"},"author":{"name":"admin@wunen","@id":"https:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8"},"headline":"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875","datePublished":"2025-05-12T04:00:08+00:00","mainEntityOfPage":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/"},"wordCount":1845,"commentCount":0,"publisher":{"@id":"https:\/\/www.wunen.com\/#organization"},"image":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage"},"thumbnailUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","articleSection":["\u56fe\u4e66\u9605\u8bfb"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/","url":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/","name":"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","isPartOf":{"@id":"https:\/\/www.wunen.com\/#website"},"primaryImageOfPage":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage"},"image":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage"},"thumbnailUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","datePublished":"2025-05-12T04:00:08+00:00","breadcrumb":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#primaryimage","url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","contentUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","width":260,"height":180},{"@type":"BreadcrumbList","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/12\/%e9%98%85%e8%af%bb%e5%9b%be%e4%b9%a6%e7%bf%bb%e9%a1%b5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wunen.com\/"},{"@type":"ListItem","position":2,"name":"\u9605\u8bfb\u56fe\u4e66\u7ffb\u9875"}]},{"@type":"WebSite","@id":"https:\/\/www.wunen.com\/#website","url":"https:\/\/www.wunen.com\/","name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","description":"\u8f6f\u4ef6\u8d44\u8baf\u6765\u7269\u5ae9","publisher":{"@id":"https:\/\/www.wunen.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wunen.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"https:\/\/www.wunen.com\/#organization","name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","url":"https:\/\/www.wunen.com\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wunen.com\/#\/schema\/logo\/image\/","url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png","contentUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png","width":1024,"height":1024,"caption":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51"},"image":{"@id":"https:\/\/www.wunen.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8","name":"admin@wunen","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wunen.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g","caption":"admin@wunen"},"sameAs":["http:\/\/www.wunen.com"],"url":"http:\/\/www.wunen.com\/index.php\/author\/adminwunen\/"}]}},"_links":{"self":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts\/2158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/comments?post=2158"}],"version-history":[{"count":0,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts\/2158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/media\/215"}],"wp:attachment":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/media?parent=2158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/categories?post=2158"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/tags?post=2158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}