當前位置: 首頁>>代碼示例>>Java>>正文


Java TextView.getLayout方法代碼示例

本文整理匯總了Java中android.widget.TextView.getLayout方法的典型用法代碼示例。如果您正苦於以下問題:Java TextView.getLayout方法的具體用法?Java TextView.getLayout怎麽用?Java TextView.getLayout使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在android.widget.TextView的用法示例。


在下文中一共展示了TextView.getLayout方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。

示例1: getPreciseOffset

import android.widget.TextView; //導入方法依賴的package包/類
public static int getPreciseOffset(TextView textView, int x, int y) {
    Layout layout = textView.getLayout();
    if (layout != null) {
        int topVisibleLine = layout.getLineForVertical(y);
        int offset = layout.getOffsetForHorizontal(topVisibleLine, x);

        int offsetX = (int) layout.getPrimaryHorizontal(offset);

        if (offsetX > x) {
            return layout.getOffsetToLeftOf(offset);
        } else {
            return offset;
        }
    } else {
        return -1;
    }
}
 
開發者ID:shenhuanet,項目名稱:SelectableTextProvider,代碼行數:18,代碼來源:TextLayoutUtil.java

示例2: getPressedSpan

import android.widget.TextView; //導入方法依賴的package包/類
public ITouchableSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();

    x -= textView.getTotalPaddingLeft();
    y -= textView.getTotalPaddingTop();

    x += textView.getScrollX();
    y += textView.getScrollY();

    Layout layout = textView.getLayout();
    int line = layout.getLineForVertical(y);
    int off = layout.getOffsetForHorizontal(line, x);
    if (x < layout.getLineLeft(line) || x > layout.getLineRight(line)) {
        // 實際上沒點到任何內容
        off = -1;
    }

    ITouchableSpan[] link = spannable.getSpans(off, off, ITouchableSpan.class);
    ITouchableSpan touchedSpan = null;
    if (link.length > 0) {
        touchedSpan = link[0];
    }
    return touchedSpan;
}
 
開發者ID:coopese,項目名稱:qmui,代碼行數:26,代碼來源:QMUILinkTouchDecorHelper.java

示例3: textTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
/**
 * 微博文本觸摸監聽處理
 *
 * @param textView 點擊的TextView
 * @param event
 * @return true:點擊事件被處理;false:點擊事件未被處理,向上冒泡
 */
private boolean textTouchEvent(TextView textView, MotionEvent event) {
    boolean ret = false;
    CharSequence text = textView.getText();
    Spannable sText = Spannable.Factory.getInstance().newSpannable(text);
    int action = event.getAction();
    if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        x -= textView.getTotalPaddingLeft();
        y -= textView.getTotalPaddingTop();
        x += textView.getScrollX();
        y += textView.getScrollY();
        Layout layout = textView.getLayout();
        int line = layout.getLineForVertical(y);
        int offset = layout.getOffsetForHorizontal(line, x);
        ClickableSpan[] links = sText.getSpans(offset, offset, ClickableSpan.class);
        if (links.length != 0) {
            if (action == MotionEvent.ACTION_UP) {
                links[0].onClick(textView);
            }
            ret = true;
        }
    }
    return ret;
}
 
開發者ID:liying2008,項目名稱:Simpler,代碼行數:33,代碼來源:StatusDataSetter.java

示例4: findClickableSpanUnderTouch

import android.widget.TextView; //導入方法依賴的package包/類
private BetterLinkMovementExtended.ClickableSpanWithText findClickableSpanUnderTouch(TextView textView, Spannable text, MotionEvent event) {
    int touchX = (int) event.getX();
    int touchY = (int) event.getY();
    touchX -= textView.getTotalPaddingLeft();
    touchY -= textView.getTotalPaddingTop();
    touchX += textView.getScrollX();
    touchY += textView.getScrollY();
    Layout layout = textView.getLayout();
    int touchedLine = layout.getLineForVertical(touchY);
    int touchOffset = layout.getOffsetForHorizontal(touchedLine, (float) touchX);
    this.touchedLineBounds.left = layout.getLineLeft(touchedLine);
    this.touchedLineBounds.top = (float) layout.getLineTop(touchedLine);
    this.touchedLineBounds.right = layout.getLineWidth(touchedLine) + this.touchedLineBounds.left;
    this.touchedLineBounds.bottom = (float) layout.getLineBottom(touchedLine);
    if (this.touchedLineBounds.contains((float) touchX, (float) touchY)) {
        Object[] spans = text.getSpans(touchOffset, touchOffset, SPAN_CLASS);
        for (Object span : spans) {
            if (span instanceof ClickableSpan) {
                return ClickableSpanWithText.ofSpan(textView, (ClickableSpan) span);
            }
        }
        return null;
    } else {
        return null;
    }
}
 
開發者ID:duyp,項目名稱:mvvm-template,代碼行數:27,代碼來源:BetterLinkMovementExtended.java

示例5: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();

    x -= widget.getTotalPaddingLeft();
    y -= widget.getTotalPaddingTop();

    x += widget.getScrollX();
    y += widget.getScrollY();

    Layout layout = widget.getLayout();
    int line = layout.getLineForVertical(y);
    int off = layout.getOffsetForHorizontal(line, x);

    MathSpannable[] spans = buffer.getSpans(off, off, MathSpannable.class);

    if (spans.length != 0) {
        return spans[0].onTouchEvent(event);
    }

    return false;
}
 
開發者ID:tranleduy2000,項目名稱:floating_calc,代碼行數:24,代碼來源:CalculatorEditText.java

示例6: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    if (event.getAction() == 1) {
        this.mLinkClicked = false;
        this.mClickedLink = null;
        int x = (((int) event.getX()) - widget.getTotalPaddingLeft()) + widget.getScrollX();
        int y = (((int) event.getY()) - widget.getTotalPaddingTop()) + widget.getScrollY();
        Layout layout = widget.getLayout();
        int off = layout.getOffsetForHorizontal(layout.getLineForVertical(y), (float) x);
        ClickableSpan[] link = (ClickableSpan[]) buffer.getSpans(off, off, ClickableSpan
                .class);
        if (link.length != 0) {
            SensibleUrlSpan span = link[0];
            this.mLinkClicked = span.onClickSpan(widget);
            this.mClickedLink = span.getURL();
            return this.mLinkClicked;
        }
    }
    super.onTouchEvent(widget, buffer, event);
    return false;
}
 
開發者ID:JackChan1999,項目名稱:boohee_v5.6,代碼行數:21,代碼來源:LinkUtils.java

示例7: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    int action = event.getAction();
    if (action == 1 || action == 0) {
        int x = (((int) event.getX()) - widget.getTotalPaddingLeft()) + widget.getScrollX();
        int y = (((int) event.getY()) - widget.getTotalPaddingTop()) + widget.getScrollY();
        Layout layout = widget.getLayout();
        int off = layout.getOffsetForHorizontal(layout.getLineForVertical(y), (float) x);
        MyURLSpan[] link = (MyURLSpan[]) buffer.getSpans(off, off, MyURLSpan.class);
        if (link.length != 0) {
            if (action == 1) {
                if (!this.mHasPerformedLongPress) {
                    link[0].onClick(widget);
                }
                this.pressed = false;
                this.lastEvent = new float[2];
            } else if (action == 0) {
                this.pressed = true;
                this.lastEvent[0] = event.getX();
                this.lastEvent[1] = event.getY();
                checkForLongClick(link, widget);
            }
            return true;
        }
    } else if (action == 2) {
        float[] position = new float[]{event.getX(), event.getY()};
        if (Math.sqrt(Math.hypot((double) Math.abs(this.lastEvent[0] - position[0]), (double)
                Math.abs(this.lastEvent[1] - position[1]))) > ((double) 6)) {
            this.pressed = false;
        }
    } else if (action == 3) {
        this.pressed = false;
        this.lastEvent = new float[2];
    } else {
        this.pressed = false;
        this.lastEvent = new float[2];
    }
    return super.onTouchEvent(widget, buffer, event);
}
 
開發者ID:JackChan1999,項目名稱:boohee_v5.6,代碼行數:39,代碼來源:LongClickableLinkMovementMethod.java

示例8: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP ||
            action == MotionEvent.ACTION_DOWN) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);

        if (link.length != 0) {
            if (action == MotionEvent.ACTION_UP) {
                link[0].onClick(widget);
            } else if (action == MotionEvent.ACTION_DOWN) {
                Selection.setSelection(buffer,
                        buffer.getSpanStart(link[0]),
                        buffer.getSpanEnd(link[0]));
            }

            return true;
        } else {
            Selection.removeSelection(buffer);
            Touch.onTouchEvent(widget, buffer, event);
            return false;
        }
    }
    return Touch.onTouchEvent(widget, buffer, event);
}
 
開發者ID:SysdataSpA,項目名稱:SDHtmlTextView,代碼行數:40,代碼來源:LocalLinkMovementMethod.java

示例9: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    //http://stackoverflow.com/questions/1697084/handle-textview-link-click-in-my-android-app
    int action = event.getAction();
    if (action == MotionEvent.ACTION_UP) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
        if (link.length > 0) {
            URLSpan span = link[0];
            String url = span.getURL();
            Spanned s = (Spanned) widget.getText();
            int start = s.getSpanStart(span);
            int end = s.getSpanEnd(span);
            //http://stackoverflow.com/a/19750721/895797
            String title = null;
            if (start != -1 && end != -1) {
                CharSequence wordThatWasClicked = s.subSequence(start, end);
                title = wordThatWasClicked.toString();
            }
            onLinkClicked(widget, url, title);
            return true;
        }
    }
    return super.onTouchEvent(widget, buffer, event);
}
 
開發者ID:Commit451,項目名稱:InternalLinkMovementMethod,代碼行數:38,代碼來源:InternalLinkMovementMethod.java

示例10: isEllipsed

import android.widget.TextView; //導入方法依賴的package包/類
public static boolean isEllipsed(@NonNull TextView textView) {
    Layout layout = textView.getLayout();
    if (layout != null) {
        int lines = layout.getLineCount();
        if (lines > 0) {
            return IntStream.range(0, lines).anyMatch(line -> layout.getEllipsisCount(line) > 0);
        }
    }
    return false;
}
 
開發者ID:duyp,項目名稱:mvvm-template,代碼行數:11,代碼來源:ViewHelper.java

示例11: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
public boolean onTouchEvent(TextView widget, Spannable buffer,
                            MotionEvent event) {

    int action = event.getAction();
    if(action == MotionEvent.ACTION_DOWN){
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        mClickLinks = buffer.getSpans(off, off, ClickableSpan.class);
        if(mClickLinks.length > 0){
            // 點擊的是Span區域,不要把點擊事件傳遞
            setPassToTv(false);
            Selection.setSelection(buffer,
                    buffer.getSpanStart(mClickLinks[0]),
                    buffer.getSpanEnd(mClickLinks[0]));
            //設置點擊區域的背景色
            mBgSpan = new BackgroundColorSpan(AppApplication.getAppResources().getColor(mClickableSpanBgClorId));
            buffer.setSpan(mBgSpan,
                    buffer.getSpanStart(mClickLinks[0]),
                    buffer.getSpanEnd(mClickLinks[0]),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }else{
            setPassToTv(true);
            // textview選中效果
            widget.setBackgroundResource(mTextViewBgColorId);
        }

    }else if(action == MotionEvent.ACTION_UP){
        if(mClickLinks.length > 0){
            mClickLinks[0].onClick(widget);
            if(mBgSpan != null){
                buffer.removeSpan(mBgSpan);
            }
        }else{
            if(mBgSpan != null){
                buffer.removeSpan(mBgSpan);
            }
        }
        Selection.removeSelection(buffer);
        widget.setBackgroundResource(DEFAULT_COLOR);
    }else if(action == MotionEvent.ACTION_MOVE){

    }else{
        if(mBgSpan != null){
            buffer.removeSpan(mBgSpan);
        }
        widget.setBackgroundResource(DEFAULT_COLOR);
    }
    return Touch.onTouchEvent(widget, buffer, event);
}
 
開發者ID:wp521,項目名稱:MyFire,代碼行數:61,代碼來源:CircleMovementMethod.java

示例12: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP ||
            action == MotionEvent.ACTION_DOWN) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        LongClickableSpan[] link = buffer.getSpans(off, off, LongClickableSpan.class);

        if (link.length != 0) {
            long currTime = System.currentTimeMillis();
            LongClickableSpan l = link[0];
            int ls = buffer.getSpanStart(l);
            int le = buffer.getSpanEnd(l);
            // 判斷點擊的點是否在Image範圍內
            ClickableImageSpan[] is = buffer.getSpans(ls, le, ClickableImageSpan.class);
            if (is.length > 0) {
                if (!is[0].clicked(x)) {
                    Selection.removeSelection(buffer);
                    return false;
                }
            } else if (off < layout.getOffsetToLeftOf(ls) || off > layout.getOffsetToLeftOf(le + 1)) {
                // 判斷點擊位置是否在鏈接範圍內
                Selection.removeSelection(buffer);
                return false;
            }

            if (action == MotionEvent.ACTION_UP) {
                // 如果按下時間超過500毫秒,觸發長按事件
                if (currTime - lastTime > MIN_INTERVAL) {
                    if (!l.onLongClick(widget)) {
                        // onLongClick返回false代表事件未處理,交由onClick處理
                        l.onClick(widget);
                    }
                } else {
                    l.onClick(widget);
                }
            } else {
                Selection.setSelection(buffer,
                        ls, le);
            }
            lastTime = currTime;
            return true;
        } else {
            Selection.removeSelection(buffer);
            return false;
        }
    }

    return super.onTouchEvent(widget, buffer, event);
}
 
開發者ID:nichbar,項目名稱:Aequorea,代碼行數:64,代碼來源:LongClickableLinkMovementMethod.java

示例13: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
        public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                        case MotionEvent.ACTION_DOWN:
//                                                這裏得到的x ,  y值隻是相對於屏幕的位置
                                int x = (int) event.getX();
                                int y = (int) event.getY();
                                x -= widget.getTotalPaddingLeft();
                                y -= widget.getTotalPaddingTop();
                                x += widget.getScrollX();
                                y += widget.getScrollY();
                                Layout layout = widget.getLayout();
                                int location = layout.getOffsetForHorizontal(layout.getLineForVertical(y), x);
                                clickableSpans = text.getSpans(location, location, ClickableSpan.class);
                                if (clickableSpans.length > 0) {
                                        isClickTextView = false;
                                        LogUtil.e("點擊clickSpan位置");
//                                                        選中點擊位置
//                                        Selection.setSelection(text, text.getSpanStart(clickableSpans[0]), text.getSpanEnd(clickableSpans[0]));
                                        text.setSpan(colorSpan = new BackgroundColorSpan(selectedColor), text.getSpanStart(clickableSpans[0]), text.getSpanEnd(clickableSpans[0]), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                                        return true;
                                } else {
                                        isClickTextView = true;
                                        widget.setBackgroundColor(Color.parseColor("#979595"));
                                        LogUtil.e("點擊的是正常textView的文字");
                                }
                                break;
                        case MotionEvent.ACTION_MOVE:
                                break;
                        case MotionEvent.ACTION_UP:
                                if (clickableSpans.length > 0) {
                                        LogUtil.e("點擊span的up11");
//                                                        設置點擊時間
                                        clickableSpans[0].onClick(widget);
                                        text.removeSpan(colorSpan);
//                                        Selection.removeSelection(text);
                                        return true;
                                } else {
                                        LogUtil.e("點擊textView文字的up11");
                                        widget.setBackgroundColor(Color.parseColor("#00000000"));
                                }
                                break;
                        default:
                                if (colorSpan != null) {
                                        text.removeSpan(colorSpan);
//                                        Selection.removeSelection(text);
                                        return true;
                                } else {
                                        widget.setBackgroundColor(Color.parseColor("#00000000"));
                                }
                                break;
                }
                return super.onTouchEvent(widget, text, event);
        }
 
開發者ID:HelloChenJinJun,項目名稱:TestChat,代碼行數:56,代碼來源:CustomMoveMethod.java

示例14: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
  int action = event.getAction();

  if (action == MotionEvent.ACTION_UP ||
          action == MotionEvent.ACTION_DOWN) {
    int x = (int) event.getX();
    int y = (int) event.getY();

    x -= widget.getTotalPaddingLeft();
    y -= widget.getTotalPaddingTop();

    x += widget.getScrollX();
    y += widget.getScrollY();

    Layout layout = widget.getLayout();
    int line = layout.getLineForVertical(y);
    int off = layout.getOffsetForHorizontal(line, x);

    LongClickCopySpan longClickCopySpan[] = buffer.getSpans(off, off, LongClickCopySpan.class);
    if (longClickCopySpan.length != 0) {
      LongClickCopySpan aSingleSpan = longClickCopySpan[0];
      if (action == MotionEvent.ACTION_DOWN) {
        Selection.setSelection(buffer, buffer.getSpanStart(aSingleSpan),
                buffer.getSpanEnd(aSingleSpan));
        aSingleSpan.setHighlighted(true,
                ContextCompat.getColor(widget.getContext(), R.color.touch_highlight));
      } else {
        Selection.removeSelection(buffer);
        aSingleSpan.setHighlighted(false, Color.TRANSPARENT);
      }

      this.currentSpan = aSingleSpan;
      this.widget = widget;
      return gestureDetector.onTouchEvent(event);
    }
  } else if (action == MotionEvent.ACTION_CANCEL) {
    // Remove Selections.
    LongClickCopySpan[] spans = buffer.getSpans(Selection.getSelectionStart(buffer),
            Selection.getSelectionEnd(buffer), LongClickCopySpan.class);
    for (LongClickCopySpan aSpan : spans) {
      aSpan.setHighlighted(false, Color.TRANSPARENT);
    }
    Selection.removeSelection(buffer);
    return gestureDetector.onTouchEvent(event);
  }
  return super.onTouchEvent(widget, buffer, event);
}
 
開發者ID:CableIM,項目名稱:Cable-Android,代碼行數:49,代碼來源:LongClickMovementMethod.java

示例15: onTouchEvent

import android.widget.TextView; //導入方法依賴的package包/類
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP ||
            action == MotionEvent.ACTION_DOWN ||
            action == MotionEvent.ACTION_MOVE ||
            action == MotionEvent.ACTION_CANCEL) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= widget.getTotalPaddingLeft();
        y -= widget.getTotalPaddingTop();

        x += widget.getScrollX();
        y += widget.getScrollY();

        Layout layout = widget.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        ImageTextSpan[] link = buffer.getSpans(off, off, ImageTextSpan.class);

        if (link.length > 0) {
            ImageTextSpan imageTextSpan = link[0];
            int spanStart = buffer.getSpanStart(imageTextSpan);
            int spanEnd = buffer.getSpanEnd(imageTextSpan);
            int showTextLength = imageTextSpan.getShowTextLength();

            int top = layout.getLineTop(line);
            int bottom = layout.getLineTop(line + 1);
            float left = layout.getPrimaryHorizontal(spanStart);
            float right = layout.getPrimaryHorizontal(spanStart + showTextLength);

            if (imageTextSpan.isCanClick() && (x >= left && x <= right)   /*(off >= spanStart && off <= spanStart + showTextLength)*/) {
                if (action == MotionEvent.ACTION_UP) {
                    imageTextSpan.onTouchUp(widget);
                    imageTextSpan.onClick(widget);
                    isTouchInSpan = false;
                } else if (action == MotionEvent.ACTION_DOWN) {
                    isTouchInSpan = true;
                    imageTextSpan.onTouchDown(widget, event.getX(), event.getY());
                    if (showSelectionSpanBgColor) {
                        Selection.setSelection(buffer,
                                spanStart,
                                spanEnd);
                    }
                } else if (action == MotionEvent.ACTION_MOVE) {
                    //link[0].onTouchMove(widget, event.getX(), event.getY());
                    //return super.onTouchEvent(widget, buffer, event);
                } else {
                    isTouchInSpan = false;
                    imageTextSpan.onTouchCancel(widget, event.getX(), event.getY());
                    //return super.onTouchEvent(widget, buffer, event);
                }

            } else {
                Selection.removeSelection(buffer);
            }
            return isTouchInSpan;
        } else {
            Selection.removeSelection(buffer);
        }
    }

    return super.onTouchEvent(widget, buffer, event);
}
 
開發者ID:angcyo,項目名稱:RLibrary,代碼行數:68,代碼來源:RExTextView.java


注:本文中的android.widget.TextView.getLayout方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。