Canvas学习笔记

前言

最近看书看到canvas,加上遇到工模下的两点测试,遂仿照写一个,顺便学习一下canvas。

一、简单介绍要做成的样子

1.canvas 画一个点
2.手指点击屏幕的时,点就显示在手指点击的地方,暂时不处理多个手指的情况。

二、进入正题

1.canvas画圆,这个比较简单:
Paint paint = new Paint();
   paint.setColor(Color.GREEN);
   paint.setStrokeWidth(3);
canvas.drawCircle(x1, y1, 60, paint);
2.新建一个class,继承view,重写他的onDraw()方法,代码如下:
public class DrawView extends View {

    float  x1,y1;
    boolean flag;
    public DrawView(Context context,AttributeSet attributeset) {
        super(context,attributeset);
        x1=100;
        y1=100;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(3);
        paint.setTextSize(50);
        canvas.drawCircle(x1, y1, 60, paint);
    }
    public void setY1(float y) { y1 = y;}
    public void setX1(float x) { x1 = x;}
}
    这段代码基本上都很好理解,在onDraw()中画一个圆心坐标为(100,100)半径为60的圆,
这里attributeset这个属性暂时还不是特别清楚,暂时留下来,周末解决这个case
3.重写onTouchEvent事件方法。
首先贴一下xml布局:
<com.example.faker.mydraw.DrawView
     android:id="@+id/dv_circle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     />
MainActivity 中的代码
public class MainActivity extends Activity {
    float  x1,y1;
    private DrawView drawView ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawView = (DrawView) findViewById(R.id.dv_circle);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        x1 = event.getX(0);
        y1 = event.getY(0);
        drawView.setX1(x1);
        drawView.setY1(y1);
        drawView.invalidate();
        return super.onTouchEvent(event);
    }
}
    在这里我们重点关注onTouchEvent方法,首先得到屏幕上第一个触摸点的坐标,
将这个设置为圆心,drawView.invalidate();这个方法一定要调用,
如果不调用你会发现点不会随着手指移动。
这个方法源码的注释为:
     * Invalidate the whole view. If the view is visible,
     * {@link #onDraw(android.graphics.Canvas)} will be called at some point in
     * the future.
     * <p>
     * This must be called from a UI thread. To call from a non-UI thread, call
     * {@link #postInvalidate()}.
当view调用这个方法,并且这个view是visible时,那么这个方法就会使view无效。并且onDraw()方法
会重新调用。
最后加上一个canvas很好的博客

Android利用canvas画各种图形

【负荷预测】基于VMD-CNN-LSTM的负荷预测研究(Python代码实现)内容概要:本文介绍了基于变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)相结合的VMD-CNN-LSTM模型在负荷预测中的研究与应用,采用Python代码实现。该方法首先利用VMD对原始负荷数据进行分解,降低序列复杂性并提取不同频率的模态分量;随后通过CNN提取各模态的局部特征;最后由LSTM捕捉时间序列的长期依赖关系,实现高精度的负荷预测。该模型有效提升了预测精度,尤其适用于非平稳、非线性的电力负荷数据,具有较强的鲁棒性和泛化能力。; 适合人群:具备一定Python编程基础和深度学习背景,从事电力系统、能源管理或时间序列预测相关研究的科研人员及工程技术人员,尤其适合研究生、高校教师及电力行业从业者。; 使用场景及目标:①应用于日前、日内及实时负荷预测场景,支持智慧电网调度与能源优化管理;②为研究复合型深度学习模型在非线性时间序列预测中的设计与实现提供参考;③可用于学术复现、课题研究或实际项目开发中提升预测性能。; 阅读建议:建议读者结合提供的Python代码,深入理解VMD信号分解机制、CNN特征提取原理及LSTM时序建模过程,通过实验调试参数(如VMD的分解层数K、惩罚因子α等)优化模型性能,并可进一步拓展至风电、光伏等其他能源预测领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值