图形控件的绘制

    xiaoxiao2025-02-19  13

    控件的绘制

    View 和 ViewGroupView –> 功能性的,TextView ,ImageView

    ViewGroup –> 管理View,LinearLayout,Relativelayout

    measure—>onMeasure–>layout—>onLayout–>draw—>onDraw

    draw,onDraw : 决定控件长什么样子

    draw : 画背景onDraw :

    下面举个例子来看一下怎么画三角形:(多边形同理)

    先定义一个类继承View,实现里面的所有构造函数

    初始化颜料和线段:

    private Path path=new Path(); private Paint paint=new Paint();

    定义一个方法对path和paint进行设置图形参数

    private void init() { //三角形三个点确定一个形状 path.moveTo(150, 20);//起始点 path.lineTo(30, 120);//连接第二个点 path.lineTo(280,120);//连接第三个点 path.lineTo(150, 20);//连接第一个点 paint.setColor(Color.RED); //图形颜色 paint.setAntiAlias(true); //去锯齿 paint.setStyle(Style.STROKE); //画空心 paint.setStrokeWidth(3); //空心外围宽度 paint.setAlpha(150);//设置颜色透明度0——255之间 }

    重写onDraw(Canvas canvas)方法,画图形

    @Override protected void onDraw(Canvas canvas) { //画多边形(三角形) canvas.drawPath(path, paint); }

    就这样,图形就画完成了,在布局中使用:

    <com.cca.drawdemo.DrawView android:id="@+id/draw" android:layout_width="wrap_content" android:layout_height="wrap_content" />

    绘制可点击的进度条

    先定义一个类继承Button

    实现里面的构造函数,定义一个方法设置进度条,并重写onDraw()方法

    public class ProgressButton extends Button { private int progress; private Drawable drawable; public ProgressButton(Context context, AttributeSet attrs) { super(context, attrs); drawable=context.getResources().getDrawable(R.drawable.progress_btn_normal); } public ProgressButton(Context context) { super(context); drawable=context.getResources().getDrawable(R.drawable.progress_btn_normal); } public void setProgress(int progress){ this.progress=progress; //UI更新 invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //背景 //进度条 int right=(int) (getMeasuredWidth()*progress/100f+0.5f); //1、设置形状 //drawable.setBounds(left, top, right, bottom) drawable.setBounds(0, 0, right, getMeasuredHeight()); //2、画到canvas上 drawable.draw(canvas); } }

    在主函数中使用异步加载Asyn,在这里获得进度更新的数据,推送到主线程中更新UI

    public class MainActivity extends Activity { private ProgressButton progressbut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressbut = (ProgressButton) findViewById(R.id.progress); AsyncTask<Void, Integer, Void> task=new AsyncTask<Void, Integer, Void>(){ @Override protected Void doInBackground(Void... params) { //执行在子线程中 for(int i=0;i<=100;i++){ try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } //将进度推送出去 publishProgress(i); } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Integer progress=values[0]; progressbut.setProgress(progress); progressbut.setText(progress+"%"); progressbut.setTextColor(Color.WHITE); } }; task.execute(); } }

    使用时的布局:

    <com.cca.drawdemo.ProgressButton android:id="@+id/progress" android:background="@drawable/progress_bg" android:layout_width="match_parent" android:layout_height="wrap_content"/>
    转载请注明原文地址: https://ju.6miu.com/read-1296597.html
    最新回复(0)