自定义View(板块随手指移动)

本文介绍了一个具体的Android自定义View实现案例,通过触摸事件改变View的位置,并实现了简单的状态管理。文章详细展示了如何创建自定义View类,处理触摸事件,以及如何通过静态变量控制View的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.k.myapplication;

/**
 * Created by k on 2016/5/30.
 */
public class demo {
    static boolean b = false;
    static int a = 0;

    public static void startBoolean() {
        b = true;
    }
    public static void closeBoolean(){
        b = false;
    }

}

================================================================

package com.example.k.myapplication;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;

public class MainActivity extends AppCompatActivity {
MyView my;
    float value;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        my = (MyView)findViewById(R.id.my);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            demo.closeBoolean();
        }
        if (event.getAction() == MotionEvent.ACTION_DOWN) {// 按下即可触
            Log.i("ok","主");
            value = event.getY();
        }
        my.method((int)event.getX(),(int)(event.getY()-value));
        return super.onTouchEvent(event);
    }
}
================================================================================

package com.example.k.myapplication;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.RelativeLayout;

/**
 * Created by k on 2016/5/30.
 */
public class MyView extends View {
    int value = 0,value1=0;
    WindowManager wm = (WindowManager) getContext()
            .getSystemService(Context.WINDOW_SERVICE);

    int width = wm.getDefaultDisplay().getWidth();
    int height = wm.getDefaultDisplay().getHeight();
     int X;
    Context context;
   int Y;
    int a,c=0;
    public void method(int x,int y){
        value = getTop();
        Log.i("ok","y=======>"+y);
        if(demo.b) {
            if(value1 + y>0&&value1+200 + y<1280-160) {
                layout(getLeft(), value1 + y, getRight(), value1+200 + y);
            }
        }
    }
    private static final int DEFAULT_VIEW_WIDTH = 100;
    private static final int DEFAULT_VIEW_HEIGHT = 100;
    public MyView(Context context) {
        super(context);
    }
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }
    //测量自定义View的宽和高
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMesureSpec) {
        int width  = measureDimension(DEFAULT_VIEW_WIDTH, widthMeasureSpec);
        int height = measureDimension(DEFAULT_VIEW_HEIGHT, heightMesureSpec);
        setMeasuredDimension(width, height);
    }
    protected int measureDimension( int defaultSize, int measureSpec ) {
        int result = defaultSize;
        int specMode = MeasureSpec.getMode(measureSpec);
        int specSize = MeasureSpec.getSize(measureSpec);
        //当子控件被width或者height被设置为确定值时就会被激活
        if (specMode == MeasureSpec.EXACTLY) {
            result = specSize; //建议:result直接使用确定值
            }
        //当子控件被设置为wrap_content时,就会进入此判断
        else if (specMode == MeasureSpec.AT_MOST) {
            result = Math.max(defaultSize, specSize); //建议:result不能大于specSize
            }
        //UNSPECIFIED,没有任何限制,所以可以设置任何大小
        //多半出现在自定义的父控件的情况下,期望由自控件自行决定大小
        else {
            result = defaultSize;
            }
        return result;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(Color.YELLOW);
        //使view里面的正方形居中
        //canvas.drawRect(getWidth()/2-20,getHeight()/2-20,getWidth()/2+20,getHeight()/2+20,paint);
        //使正方形居中且靠右
        canvas.drawRect(0,getHeight()/2-20,40,getHeight()/2+20,paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        demo.startBoolean();
        value1 = value;
        return super.onTouchEvent(event);
    }
}

内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
内容概要:本文围绕低轨(LEO)卫星通信系统的星间切换策略展开研究,针对现有研究忽略终端运动影响导致切换失败率高的问题,提出了两种改进策略。第一种是基于预测的多属性无偏好切换策略,通过预测终端位置建立切换有向图,并利用NPGA算法综合服务时长、通信仰角和空闲信道数优化切换路径。第二种是多业务切换策略,根据不同业务需求使用层次分析法设置属性权重,并采用遗传算法筛选切换路径,同时引入多业务切换管理方法保障实时业务。仿真结果显示,这两种策略能有效降低切换失败率和新呼叫阻塞率,均衡卫星负载。 适合人群:从事卫星通信系统研究的科研人员、通信工程领域的研究生及工程师。 使用场景及目标:①研究和优化低轨卫星通信系统中的星间切换策略;②提高卫星通信系统的可靠性和效率;③保障不同类型业务的服务质量(QoS),特别是实时业务的需求。 其他说明:文章不仅详细介绍了两种策略的具体实现方法,还提供了Python代码示例,包括终端位置预测、有向图构建、多目标优化算法以及业务感知的资源分配等关键环节。此外,还设计了完整的仿真测试框架,用于验证所提策略的有效性,并提供了自动化验证脚本和创新点技术验证方案。部署建议方面,推荐使用Docker容器化仿真环境、Redis缓存卫星位置数据、GPU加速遗传算法运算等措施,以提升系统的实时性和计算效率。
内容概要:该论文深入研究了光纤陀螺(FOG)的温度特性及其补偿方法。首先分析了光纤陀螺各主要光学和电子器件的温度特性,通过有限元方法模拟温度场对陀螺的影响,进行了稳态和瞬态热分析。接着提出了高阶多项式算法和RBF神经网络算法两种温度补偿方法,并建立了相应的数学模型。论文还设计了不同温度条件下的实验以验证补偿效果,研究表明结合这两种算法能有效补偿光纤陀螺的温度漂移误差。此外,论文提供了详细的Python代码实现,包括数据预处理、补偿算法实现、有限元热分析模拟以及补偿效果的可视化。 适合人群:具备一定编程基础和物理基础知识的研究人员或工程师,尤其是从事惯性导航系统、光纤传感技术领域工作的人员。 使用场景及目标:①研究光纤陀螺在不同温度条件下的性能变化;②开发和优化温度补偿算法以提高光纤陀螺的精度;③利用提供的代码框架进行实验设计和数据分析,探索更有效的补偿策略。 其他说明:论文不仅提供了理论分析,还有具体的代码实现,有助于读者更好地理解和应用。文中涉及的补偿算法和有限元分析方法可以为其他相关领域的研究提供参考。此外,论文还讨论了温度误差的多物理场耦合机理、静态与动态补偿的综合效果以及工程实现中的关键技术瓶颈和解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值