外贸商城网站开发,建站网站哪个最好,宿州网站建设多少钱,我想注册网站怎么做先看看效果图
1.自定义 View 的基本流程
创建 View Class创建 attr 属性文件#xff0c;确定属性View Class 绑定 attr 属性onMeasure 测量onDraw 绘制onTouchEvent ( 用户交互需要处理 )
1.1 创建 View Class
package com.example.view_day05_ratingbar;import android.…先看看效果图
1.自定义 View 的基本流程
创建 View Class创建 attr 属性文件确定属性View Class 绑定 attr 属性onMeasure 测量onDraw 绘制onTouchEvent ( 用户交互需要处理 )
1.1 创建 View Class
package com.example.view_day05_ratingbar;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;import androidx.annotation.Nullable;public class RatingBar extends View {private static final String TAG wqq;private Bitmap mStartNormalBitmap,mStartFocusBitmap;private int mGradeNumber 5;private int mCurrentGrade 0;public RatingBar(Context context) {this(context, null);}public RatingBar(Context context, Nullable org.jetbrains.annotations.Nullable AttributeSet attrs) {this(context, attrs, 0);}public RatingBar(Context context, Nullable org.jetbrains.annotations.Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray array context.obtainStyledAttributes(attrs,R.styleable.RatingBar);int starNormalID array.getResourceId(R.styleable.RatingBar_starNormal,0);if (starNormalID 0) {throw new RuntimeException(请设置属性 startNormal);}mStartNormalBitmap BitmapFactory.decodeResource(getResources(),starNormalID);int startFocusId array.getResourceId(R.styleable.RatingBar_starFocus, 0);if (startFocusId 0) {throw new RuntimeException(请设置属性 startFocusId);}mStartFocusBitmap BitmapFactory.decodeResource(getResources(), startFocusId);mGradeNumber array.getInt(R.styleable.RatingBar_gradeNumber,0);array.recycle();}Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//高度 一张图片的高度自己去实现 paddingint height mStartNormalBitmap.getHeight();int width mGradeNumber * mStartFocusBitmap.getWidth();setMeasuredDimension(width,height);}Overrideprotected void onDraw(Canvas canvas) {for (int i 0; i mGradeNumber; i) {int x i * mStartFocusBitmap.getWidth();if (mCurrentGrade i) {canvas.drawBitmap(mStartFocusBitmap,x,0,null);} else {canvas.drawBitmap(mStartNormalBitmap,x,0,null);}}}Overridepublic boolean onTouchEvent(MotionEvent event) {//移动 按下 抬起 处理逻辑都是一样判断手指的位置根据当前位置计算出分数再去刷新界面显示switch(event.getAction()) {case MotionEvent.ACTION_DOWN: //按下case MotionEvent.ACTION_MOVE: // 移动//case MotionEvent.ACTION_UP: // 抬起,up事件可以去掉优化ondraw调用次数float moveX event.getX(); // event.getX()获取相对于当前控件的位置event.getRawX()获取屏幕的x位置Log.e(TAG, movex: moveX event: event.getAction());int currentGrade (int)(moveX/mStartFocusBitmap.getWidth() 1);if (currentGrade 0) {currentGrade 0;}if (currentGrade mGradeNumber) {currentGrade mGradeNumber;}//相等的话就不用重复绘制了if (currentGrade mCurrentGrade) {return true;}mCurrentGrade currentGrade;//刷新显示invalidate();// 由于ondraw流程很长尽量减少ondraw的调用,减少内存break;}return true;}
}
下篇文字会分析 onTouchEvent 源码为什么要设置返回 true
1.2 创建 attr
?xml version1.0 encodingutf-8?
resourcesdeclare-styleable nameRatingBar!--未选中引用--attr namestarNormal formatreference /!--选中引用--attr namestarFocus formatreference /!--最大的分数--attr namegradeNumber formatinteger /!--当前的分数--attr namecurrentGrade formatinteger /!--星星之间的间距--attr namestarPadding formatdimension //declare-styleable
/resources1.3 创建图片资源
在\app\src\main\res目录下创建文件夹drawable-xhdpi将星星图片复制进去。
1.4 布局文件
activity_main.xml
?xml version1.0 encodingutf-8?
RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityTextViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textHello World!app:layout_constraintBottom_toBottomOfparentapp:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparentapp:layout_constraintTop_toTopOfparent /com.example.view_day05_ratingbar.RatingBarandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:backgroundcolor/purple_200app:starPadding50dpapp:starFocusdrawable/selectapp:starNormaldrawable/start_normalapp:gradeNumber5//RelativeLayout