永发信息网

android开发中怎么自定义一个可以在屏幕上自由拖动popularwindows

答案:2  悬赏:60  手机版
解决时间 2021-03-04 23:45
android开发中怎么自定义一个可以在屏幕上自由拖动popularwindows
最佳答案
主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置

代码:
Activity

package com.view;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 隐藏状态栏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

// 把Activity的标题去掉
requestWindowFeature(Window.FEATURE_NO_TITLE);

// 设置布局
this.setContentView(new MySurfaceView(this));
}
}

SurfaceView

package com.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements Runnable, Callback {

private SurfaceHolder mHolder; // 用于控制SurfaceView

private Thread t; // 声明一条线程

private boolean flag; // 线程运行的标识,用于控制线程

private Canvas mCanvas; // 声明一张画布

private Paint p; // 声明一支画笔

private int x = 50, y = 50, r = 10; // 圆的坐标和半径

public MySurfaceView(Context context) {
super(context);

mHolder = getHolder(); // 获得SurfaceHolder对象
mHolder.addCallback(this); // 为SurfaceView添加状态监听
p = new Paint(); // 创建一个画笔对象
p.setColor(Color.WHITE); // 设置画笔的颜色为白色
setFocusable(true); // 设置焦点
}


public void Draw() {
mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画
mCanvas.drawRGB(0, 0, 0); // 把画布填充为黑色
mCanvas.drawCircle(x, y, r, p); // 画一个圆
mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上
}


@Override
public void surfaceCreated(SurfaceHolder holder) {
t = new Thread(this); // 创建一个线程对象
flag = true; // 把线程运行的标识设置成true
t.start(); // 启动线程
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false; // 把线程运行的标识设置成false
}


@Override
public boolean onTouchEvent(MotionEvent event) {
x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标
y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标
return true;
}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){ //当用户点击↑键时
y--; //设置Y轴坐标减1
}
return super.onKeyDown(keyCode, event);
}

@Override
public void run() {
while (flag) {
Draw(); // 调用自定义画画方法
try {
Thread.sleep(50); // 让线程休息50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

MySurfaceView首先继承SurfaceView,然后实现Runnable和Callback接口

重写了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,
还实现了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法来,详细的在代码里已注释。
全部回答
搜一下:android开发中怎么自定义一个可以在屏幕上自由拖动popularwindows
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我女儿6岁比较叛逆喜欢和大人对着干!我改怎
无泡沫的洁面乳挤到手心时要加水吗
下列哪种教室照明布灯方法可减少眩光效应?(2
石块登怎么去啊,有知道地址的么
按要求句型转换:Mary was riding a bike at
宏观调控案例
音箱怎么连接手机放歌
电脑耳机没声音怎么设置电脑找不到音频设备
【is a song now singing Ann.连词成句】
五菱荣光雨刮器为什么有20加16和22加16这样的
橱柜台面用深色好还是浅色好
iPhone 6的摄像头材质是什么?
【日全食的过程】日全食的过程描述每一个阶段
裕景酒店这个地址在什么地方,我要处理点事
直字里面有九横上面有三朵云打一成语
推荐资讯
手机上的相机怎么打不开前摄相头了打开切换按
剑三里面在哪悬赏别人
以下哪个不是京都动画作品A.凉宫春日的忧郁B.
i5-3210M处理器与 i5-4210U有什么差别,哪个
我喉咙痛,鼻塞,感觉浑身都没劲的呢
塔罗牌占卜能精确到几几年几月几日吗?
一帧上看到很多短视频创作者的数据信息,都是
宝路华新城汽车站地址在什么地方,想过去办事
如何除掉玉石首饰上的污垢
当多边形内有2枚钉子时,面积有什么规律
母乳喂养有利于预防佝偻病的主要原因是()A.含
陶然亭公园的评价
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?