最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android評分RationBar控件使用詳解

 更新時間:2019年12月20日 08:27:37   作者:最愛爬爬蝦  
這篇文章主要為大家詳細介紹了Android評分RationBar控件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Android評分RationBar控件,供大家參考,具體內容如下

主要是不想用太多三方的控件,所以決定盡可能自己寫,最近有寫一個評分的頁面,廢話不多說直接上圖


我覺得嘛 這個東西用ViewGroup包起來感覺會寫很多View 于是我決定使用之定義控件 直接上代碼

/**
 * 評論專用星星
 * <p>
 * 寬高都不能用wrap_content 必須使用固定值或者match_parent
 * <p>
 * MIXED : 在控件的寬度范圍內等分星星
 * <p>
 * SCROLL:根據(jù) 星星的寬度和每個星星之間的間距畫星星
 */
public class SuperRationBar extends View implements View.OnTouchListener {

  final public static int MIXED = 0;

  final public static int SCROLL = 1;

  //不傳默認為 MIXED
  private int mode = MIXED;
  // 需要建立多少星星 不傳 默認為5
  private int number = 5;
  // 單個星星的寬度 這里寬度和高度相等 必傳
  private int startWidth = 50;
  // 每個星星之間的間距 默認20 (mode == MIXED 用不到)
  private int startPadding = 10;


  //是否已經初始化試圖
  private boolean isInit = false;
  //被選中的個數(shù)
  private int selectNumber = 0;
  //選中的樣式
  private Bitmap bmSel;
  //未選中的樣式
  private Bitmap bmNol;
  //記錄每個星星的位置 用 , 分割
  private List<String> pointList;
  // 畫筆
  private Paint mPaint;

  public SuperRationBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
    init(context);
  }

  private void init(Context context) {
    mPaint = new Paint();
    setOnTouchListener(this);
  }

  private void init(Context context, AttributeSet attrs) {
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SuperRationBar);
    mode = a.getInteger(R.styleable.SuperRationBar_mode, MIXED);
    number = a.getInteger(R.styleable.SuperRationBar_SuperRationBar_number, 5);
    startWidth = (int) a.getDimension(R.styleable.SuperRationBar_SuperRationBar_startWidth, 50);
    startPadding = (int) a.getDimension(R.styleable.SuperRationBar_SuperRationBar_startPadding, 10);
    a.recycle();
  }

  @Override
  public void draw(Canvas canvas) {
    super.draw(canvas);
    if (!isInit) {
      return;
    }
    {//記錄每個星星的位置 用 , 分割
      pointList = new ArrayList<>();
    }
    if (mode == MIXED) {
      //單個星星的寬度
      int itemWidth = getWidth() / number;
      //根據(jù)每個星星之間的間距畫星星
      for (int i = 0; i < number; i++) {
        int left = i == 0 ? 0 : itemWidth * i;
        int height = getHeight();
        int bmHeight = bmSel.getHeight();
        int top = (getHeight() - startWidth) / 2;
        pointList.add(left + "," + top + "," + (left + itemWidth) + "," + (top + itemWidth));
        if (i < selectNumber) {
          canvas.drawBitmap(bmSel, left, top, mPaint);
        } else {
          canvas.drawBitmap(bmNol, left, top, mPaint);
        }
      }
    } else if (mode == SCROLL) {
      int totalWidth = (startWidth + startPadding) * (number - 1) + startWidth;
      //單個星星的寬度
      int itemWidth = totalWidth / number;
      //根據(jù)每個星星之間的間距畫星星
      for (int i = 0; i < number; i++) {
        int left = i == 0 ? 0 : itemWidth * i;
        int top = (getHeight() - startWidth) / 2;
        pointList.add(left + "," + top + "," + (left + itemWidth) + "," + (top + itemWidth));
        if (i < selectNumber) {
          canvas.drawBitmap(bmSel, left, top, mPaint);
        } else {
          canvas.drawBitmap(bmNol, left, top, mPaint);
        }
      }
    }
  }

  @Override
  protected void onFinishInflate() {
    super.onFinishInflate();
    isInit = true;
  }

  /**
   * 設置三種圖片樣式的id
   *
   * @param selId
   * @param nolId
   */
  public SuperRationBar setImageResIds(int selId, int nolId) {
    bmSel = BitmapFactory.decodeResource(getResources(), selId);
    bmNol = BitmapFactory.decodeResource(getResources(), nolId);
    bmSel = zoomBitmap(bmSel, startWidth);
    bmNol = zoomBitmap(bmNol, startWidth);
    return this;
  }

  /**
   * 調用這個方法刷新頁面
   */
  public void launcher() {
    if (isInit) {
      postInvalidate();
    } else {
      post(new Runnable() {
        @Override
        public void run() {
          postInvalidate();
        }
      });
    }
  }

  @Override
  public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN
        || event.getAction() == MotionEvent.ACTION_MOVE) {
      if (pointList != null) {
        int num = contain((int) event.getX(), (int) event.getY());
        if (num != -1) {
          selectNumber = num + 1;
        }
        postInvalidate();
      }
      if (event.getAction() == MotionEvent.ACTION_DOWN) {
        return true;
      }
    }
    return false;
  }

  /**
   * 判斷點擊的位置是不是在星星上邊 并返回星星的下標 錯誤 返回-1
   *
   * @param x
   * @param y
   * @return
   */
  private int contain(int x, int y) {
    int size = pointList.size();
    for (int i = 0; i < size; i++) {
      String[] pointArray = pointList.get(i).split(",");
      int rl = Integer.parseInt(pointArray[0]);
      int rt = Integer.parseInt(pointArray[1]);
      int rr = Integer.parseInt(pointArray[2]);
      int rb = Integer.parseInt(pointArray[3]);
      if (x > rl && x < rr) {
        //在范圍內 返回下標
        return i;
      }
    }
    return -1;
  }

  public int getSelectNumber() {
    return selectNumber;
  }


  /**
   * 等比例縮放bitmap圖片
   *
   * @param bitmap
   * @param reqWidth
   * @return
   */
  public Bitmap zoomBitmap(Bitmap bitmap, float reqWidth) {
    if (bitmap == null) {
      return null;
    }
    final int width = bitmap.getWidth();
    Matrix matrix = new Matrix();
    float scale = reqWidth / width;
    matrix.setScale(scale, scale);
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
        bitmap.getHeight(), matrix, true);
    return bitmap;
  }

}
<declare-styleable name="SuperRationBar">
    <attr name="SuperRationBar_number" format="integer" />
    <attr name="SuperRationBar_startWidth" format="dimension" />
    <attr name="SuperRationBar_startPadding" format="dimension" />
    <attr name="mode">
      <enum name="fixed" value="0" />
      <enum name="scroll" value="1" />
    </attr>
  </declare-styleable>

注釋得還是挺詳細的 這里直接上使用代碼

<com.xxx.widget.SuperRationBar
    android:id="@+id/RationBar0"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginLeft="50dp"
    android:layout_marginTop="10dp"
    android:layout_marginRight="50dp"
    android:background="@color/colorAccent"
    app:SuperRationBar_number="6"
    app:SuperRationBar_startPadding="10dp"
    app:SuperRationBar_startWidth="40dp"
    app:mode="fixed" />
SuperRationBar_startWidth 這個為必傳 而且只能在布局里面?zhèn)?
 RationBar0.setImageResIds(R.mipmap.img_ration_bar_sel, R.mipmap.img_ration_bar_nol)
        .launcher();

使用就這么一句 調用

int number0 = RationBar0.getSelectNumber(); 

可以獲取到當前的評分是多少

以上代碼可以復制粘貼使用 有經驗的小伙伴們 改改代碼就可以實現(xiàn) 別的功能了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 30條android項目開發(fā)技巧與經驗總結

    30條android項目開發(fā)技巧與經驗總結

    本文為大家總結了30條android項目開發(fā)技巧與經驗,,需要的朋友可以參考下
    2018-04-04
  • android實現(xiàn)單選按鈕功能

    android實現(xiàn)單選按鈕功能

    這篇文章主要為大家詳細介紹了android實現(xiàn)單選按鈕功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • android圖片處理之讓圖片變成圓形

    android圖片處理之讓圖片變成圓形

    如何讓圖片變成圓形,這篇文章主要為大家詳細介紹了android圖片處理中讓圖片變成圓形的方法,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android實現(xiàn)炫酷的CheckBox效果

    Android實現(xiàn)炫酷的CheckBox效果

    大家是不是對系統(tǒng)自帶的CheckBox產生乏味感了呢?今天這篇文章給大家?guī)淼氖且豢钊碌腃heckBox,下面來一起看看下面的CheckBox吧!有需要的朋友們可以參考借鑒。
    2016-10-10
  • Android學習筆記--使用剪切板在Activity中傳值示例代碼

    Android學習筆記--使用剪切板在Activity中傳值示例代碼

    相對于getText和setText而言,利用ClipData對象來傳遞數(shù)據(jù),更符合面向對象的思想,而且所能傳遞的數(shù)據(jù)類型也多樣化了
    2013-06-06
  • android popuwindow點擊外部窗口不消失的實例

    android popuwindow點擊外部窗口不消失的實例

    下面小編就為大家?guī)硪黄猘ndroid popuwindow點擊外部窗口不消失的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Android多渠道打包的方法步驟

    Android多渠道打包的方法步驟

    本篇文章主要介紹了Android多渠道打包的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 詳解Android消息機制完整的執(zhí)行流程

    詳解Android消息機制完整的執(zhí)行流程

    經過前面幾篇文章的鋪墊,介紹了Hanlder、Message等類相關使用,分析了其與Looper、MessageQueue的部分源碼,本篇文章主要是集中梳理Android整個消息機制執(zhí)行的完整流程,需要的可以參考一下
    2022-10-10
  • Android使用FontMetrics對象計算位置坐標

    Android使用FontMetrics對象計算位置坐標

    這篇文章主要為大家詳細介紹了Android使用FontMetrics對象計算位置坐標,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android自定義View實現(xiàn)球形動態(tài)加速球

    Android自定義View實現(xiàn)球形動態(tài)加速球

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)球形動態(tài)加速球,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論

二手房| 伊宁县| 凉城县| 道孚县| 扎赉特旗| 青神县| 康乐县| 金华市| 文昌市| 厦门市| 双鸭山市| 锡林郭勒盟| 东宁县| 新绛县| 手游| 河池市| 温泉县| 和静县| 阿尔山市| 阿图什市| 翁源县| 门头沟区| 白河县| 原阳县| 河曲县| 神木县| 青岛市| 萨嘎县| 淮北市| 湖南省| 泰宁县| 汽车| 石城县| 彰化县| 靖州| 开化县| 收藏| 涟源市| 高陵县| 醴陵市| 饶平县|