国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 自定義星評空間示例代碼

2019-12-12 02:42:19
字體:
來源:轉載
供稿:網友

沒事做用自定義view方式寫一個星評控件,雖說網上很多這個控件,但是這是自己寫的,在這里記錄一下。

首先需要自定義屬性

<declare-styleable name="Rate">    <!--屬性分別是:單個的寬,高,之間的距離,激活的數量,總數量,激活的drawable,沒有激活的drawable,是否可以選擇數量-->    <attr name="custom_rate_width" format="dimension"/>    <attr name="custom_rate_height" format="dimension"/>    <attr name="custom_rate_padding" format="dimension"/>    <attr name="custom_rate_active_size" format="integer"/>    <attr name="custom_rate_size" format="integer"/>    <attr name="custom_rate_active_drawable" format="reference"/>    <attr name="custom_rate_disactive_drawable" format="reference"/>    <attr name="custom_rate_touch" format="boolean"/>  </declare-styleable>

初始化代碼

 protected void init(Context context, AttributeSet attrs) {    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.Rate);    int activeId = 0;    int disactiveId = 0;    if (array != null) {      size = array.getInt(R.styleable.Rate_custom_rate_size, 5);      activeSize = array.getInt(R.styleable.Rate_custom_rate_active_size, 3);      rateWidth = array.getDimensionPixelOffset(R.styleable.Rate_custom_rate_width, 0);      rateHeight = array.getDimensionPixelOffset(R.styleable.Rate_custom_rate_height, 0);      activeId = array.getResourceId(R.styleable.Rate_custom_rate_active_drawable, 0);      disactiveId = array.getResourceId(R.styleable.Rate_custom_rate_disactive_drawable, 0);      padding = array.getDimensionPixelOffset(R.styleable.Rate_custom_rate_padding, 0);      isTouch = array.getBoolean(R.styleable.Rate_custom_rate_touch, false);      array.recycle();    }    //如果沒有寬高就設置一個默認值    if (rateHeight <= 0){      rateHeight = 80;    }    if (rateWidth <= 0){      rateWidth = 80;    }    if (activeId!=0){      activeBitmap = BitmapFactory.decodeResource(getResources(), activeId);      //如果沒有設置寬高時候      if (rateWidth <= 0) {        rateWidth = activeBitmap.getWidth();      }      //把圖片壓縮到設置的寬高      activeBitmap = Bitmap.createScaledBitmap(activeBitmap, (int) rateWidth, (int) rateHeight, false);    }    if (disactiveId != 0){      disactiveBitmap = BitmapFactory.decodeResource(getResources(), disactiveId);      if (rateHeight <= 0) {        rateHeight = activeBitmap.getHeight();      }      disactiveBitmap = Bitmap.createScaledBitmap(disactiveBitmap, (int) rateWidth, (int) rateHeight, false);    }    mPaint = new Paint();//初始化bitmap的畫筆    mPaint.setAntiAlias(true);    activPaint = new Paint();//初始化選中星星的畫筆    activPaint.setAntiAlias(true);    activPaint.setColor(Color.YELLOW);    disactivPaint = new Paint();//初始化未選中星星的畫筆    disactivPaint.setAntiAlias(true);    disactivPaint.setColor(Color.GRAY);  }

onMeasure方法設置View的寬高,如果設置的每一個星星控件的寬高大于實際view的寬高,就用星星空間的寬高作于view的寬高

@Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    int widthMode = MeasureSpec.getMode(widthMeasureSpec);    int widthSize = MeasureSpec.getSize(widthMeasureSpec);    int heightMode = MeasureSpec.getMode(heightMeasureSpec);    int heightSize = MeasureSpec.getSize(heightMeasureSpec);    //計算寬    if (widthMode == MeasureSpec.EXACTLY) {      //如果view的寬度小于設置size*星星的寬度,就用size * (int) (padding + rateWidth)做為控件的寬度度      if (widthSize < size * (int) (padding + rateWidth)) {        width = size * (int) (padding + rateWidth);      } else {        width = widthSize;      }    } else {      width = size * (int) (padding + rateWidth)-padding;    }    //計算高    if (heightMode == MeasureSpec.EXACTLY) {      //如果view的高度小于設置星星的高度,就用星星高度做為控件的高度      if (heightSize < rateHeight) {        height = (int) rateHeight + 5;      } else {        height = heightSize;      }    } else {      height = (int) rateHeight + 5;    }    setMeasuredDimension(width, height);  }

onDraw方法中繪制

//開始畫active    for (int i = 0; i < activeSize; i++) {      if (activeBitmap != null){        if (i == 0) {          canvas.drawBitmap(activeBitmap, rateWidth * i, (height - rateHeight) / 2, mPaint);        } else {          canvas.drawBitmap(activeBitmap, (rateWidth + padding) * i, (height - rateHeight) / 2, mPaint);        }      }else {        drawActivRate(i,canvas);      }    }//    //開始畫disactive    for (int i = activeSize; i < size; i++) {      if (disactiveBitmap != null){        if (i == 0) {          canvas.drawBitmap(disactiveBitmap, rateWidth * i, (height - rateHeight) / 2, mPaint);        } else {          canvas.drawBitmap(disactiveBitmap, (rateWidth + padding) * i, (height - rateHeight) / 2, mPaint);        }      }else {        drawDisActivRate(i,canvas);      }    }

上面用到兩個方法drawActivRate和drawDisActivRate,分別是在沒有設置活動中的星星和不在活動中星星的圖片的時候,繪制在活動和不在活動的默認星星:

/**   * 繪制黃色的五角星(在活動的)   * */  private void drawActivRate(int position,Canvas canvas){    float radius = rateWidth/2;//根

主站蜘蛛池模板:
泸西县|
双柏县|
岳西县|
朝阳区|
长乐市|
佛山市|
定南县|
库尔勒市|
萍乡市|
精河县|
福泉市|
民和|
高碑店市|
隆回县|
西峡县|
唐海县|
垦利县|
景宁|
定远县|
奉节县|
西华县|
扎兰屯市|
保定市|
吉木乃县|
河池市|
乌拉特后旗|
纳雍县|
黄龙县|
正定县|
沈阳市|
社旗县|
五寨县|
旌德县|
吉首市|
马鞍山市|
乐至县|
灵寿县|
聂拉木县|
葵青区|
东兴市|
宜兰市|