안 드 로 이 드 QQ 휴대 전화 관리자 부유 로켓 효과 실현
20222 단어 android작은 로켓 발사 효과플 로 팅 로켓
QQ 휴대 전화 관리 자 를 사용 해 본 친구 들 은 작은 로켓 의 가속 기능 이 있다 는 것 을 알 게 될 것 이 라 고 믿는다.작은 로켓 을 로켓 발사 대 에 끌 어 올 려 발사 하면 로켓 이 하늘 로 올 라 가 는 애니메이션 이 나 올 것 이 라 고 믿는다.그럼 오늘 은 이 효 과 를 모방 해 보 자.
이번에 우 리 는 코드 의 중점 을 로켓 의 하늘 로 올 라 가 는 효과 에 두 었 기 때문에 간단하게 말하자면 360 휴대 전화 위 사 부상 창의 그 코드 를 모방 한 토대 에서 계속 개발 했다.만약 당신 이 아직 그 글 을 보지 못 했다 면 먼저 안 드 로 이 드 데스크 톱 부상 창의 효과 실현 을 읽 고 360 휴대 전화 위 사 부상 창의 효 과 를 모방 하 는 것 을 권장 한다.
일반적인 데스크 톱 부상 창 보다 부상 창 을 끌 때 부상 창 을 작은 로켓 으로 만 들 고 화면의 아래쪽 에 로켓 발사 대 를 추가 해 야 한다.그럼 로켓 발사 대 부터 작성 합 시다.
로켓 발사 대의 레이아웃 파일 로 launcher.xml 을 먼저 만 듭 니 다.
다음 과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<ImageView
android:id="@+id/launcher_img"
android:layout_width="200dp"
android:layout_height="88dp"
android:src="@drawable/launcher_bg_hold"
/>
</LinearLayout>
현재 로켓 발사 대 상 태 를 보 여 주 는 이미지 뷰 를 볼 수 있다.나 는 작은 로켓 이 로켓 발사 대 에 끌 리 지 않 았 을 때 두 장의 사진 을 미리 준비 했다.하 나 는 작은 로켓 이 로켓 발사 대 에 끌 렸 을 때 보 여 주 는 것 이다. 로켓 발사 대 뷰 로 로켓 발사 대 뷰 를 만 들 겠 습 니 다.
코드 는 다음 과 같다.
public class RocketLauncher extends LinearLayout {
/**
*
*/
public static int width;
/**
*
*/
public static int height;
/**
*
*/
private ImageView launcherImg;
public RocketLauncher(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.launcher, this);
launcherImg = (ImageView) findViewById(R.id.launcher_img);
width = launcherImg.getLayoutParams().width;
height = launcherImg.getLayoutParams().height;
}
/**
* 。 , 。
*/
public void updateLauncherStatus(boolean isReadyToLaunch) {
if (isReadyToLaunch) {
launcherImg.setImageResource(R.drawable.launcher_bg_fire);
} else {
launcherImg.setImageResource(R.drawable.launcher_bg_hold);
}
}
}
RocketLauncher 의 코드 는 매우 간단 합 니 다.구축 방법 에서 Layout Inflater 의 inflate()방법 을 사용 하여 launcher.xml 이라는 레이아웃 파일 을 불 러 오고 현재 View 의 너비 와 높이 를 얻 었 습 니 다.updateLauncher Status()방법 에 서 는 들 어 오 는 매개 변수 가 true 라면 작은 로켓 이 발사 할 그림 을 표시 하고,들 어 오 는 것 이 false 라면 작은 로켓 을 발사 대 에 끌 어 올 리 는 그림 을 표시 한다.새로 추 가 된 파일 은 이 두 개 뿐 이 고 나머지 는 이전의 코드 를 수정 하 는 것 이다.먼저 MyWindow Manager 의 코드 를 수정 합 니 다.다음 과 같 습 니 다.
public class MyWindowManager {
/**
* View
*/
private static FloatWindowSmallView smallWindow;
/**
* View
*/
private static FloatWindowBigView bigWindow;
/**
*
*/
private static RocketLauncher rocketLauncher;
/**
* View
*/
private static LayoutParams smallWindowParams;
/**
* View
*/
private static LayoutParams bigWindowParams;
/**
*
*/
private static LayoutParams launcherParams;
/**
*
*/
private static WindowManager mWindowManager;
/**
*
*/
private static ActivityManager mActivityManager;
/**
* 。 。
*/
public static void createSmallWindow(Context context) {
WindowManager windowManager = getWindowManager(context);
int screenWidth = windowManager.getDefaultDisplay().getWidth();
int screenHeight = windowManager.getDefaultDisplay().getHeight();
if (smallWindow == null) {
smallWindow = new FloatWindowSmallView(context);
if (smallWindowParams == null) {
smallWindowParams = new LayoutParams();
smallWindowParams.type = LayoutParams.TYPE_SYSTEM_ALERT;
smallWindowParams.format = PixelFormat.RGBA_8888;
smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE;
smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
smallWindowParams.width = FloatWindowSmallView.windowViewWidth;
smallWindowParams.height = FloatWindowSmallView.windowViewHeight;
smallWindowParams.x = screenWidth;
smallWindowParams.y = screenHeight / 2;
}
smallWindow.setParams(smallWindowParams);
windowManager.addView(smallWindow, smallWindowParams);
}
}
/**
* 。
*/
public static void removeSmallWindow(Context context) {
if (smallWindow != null) {
WindowManager windowManager = getWindowManager(context);
windowManager.removeView(smallWindow);
smallWindow = null;
}
}
/**
* 。 。
*/
public static void createBigWindow(Context context) {
WindowManager windowManager = getWindowManager(context);
int screenWidth = windowManager.getDefaultDisplay().getWidth();
int screenHeight = windowManager.getDefaultDisplay().getHeight();
if (bigWindow == null) {
bigWindow = new FloatWindowBigView(context);
if (bigWindowParams == null) {
bigWindowParams = new LayoutParams();
bigWindowParams.x = screenWidth / 2
- FloatWindowBigView.viewWidth / 2;
bigWindowParams.y = screenHeight / 2
- FloatWindowBigView.viewHeight / 2;
bigWindowParams.type = LayoutParams.TYPE_PHONE;
bigWindowParams.format = PixelFormat.RGBA_8888;
bigWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
bigWindowParams.width = FloatWindowBigView.viewWidth;
bigWindowParams.height = FloatWindowBigView.viewHeight;
}
windowManager.addView(bigWindow, bigWindowParams);
}
}
/**
* 。
*/
public static void removeBigWindow(Context context) {
if (bigWindow != null) {
WindowManager windowManager = getWindowManager(context);
windowManager.removeView(bigWindow);
bigWindow = null;
}
}
/**
* , 。
*/
public static void createLauncher(Context context) {
WindowManager windowManager = getWindowManager(context);
int screenWidth = windowManager.getDefaultDisplay().getWidth();
int screenHeight = windowManager.getDefaultDisplay().getHeight();
if (rocketLauncher == null) {
rocketLauncher = new RocketLauncher(context);
if (launcherParams == null) {
launcherParams = new LayoutParams();
launcherParams.x = screenWidth / 2 - RocketLauncher.width / 2;
launcherParams.y = screenHeight - RocketLauncher.height;
launcherParams.type = LayoutParams.TYPE_PHONE;
launcherParams.format = PixelFormat.RGBA_8888;
launcherParams.gravity = Gravity.LEFT | Gravity.TOP;
launcherParams.width = RocketLauncher.width;
launcherParams.height = RocketLauncher.height;
}
windowManager.addView(rocketLauncher, launcherParams);
}
}
/**
* 。
*/
public static void removeLauncher(Context context) {
if (rocketLauncher != null) {
WindowManager windowManager = getWindowManager(context);
windowManager.removeView(rocketLauncher);
rocketLauncher = null;
}
}
/**
* 。
*/
public static void updateLauncher() {
if (rocketLauncher != null) {
rocketLauncher.updateLauncherStatus(isReadyToLaunch());
}
}
/**
* TextView , 。
*
* @param context
* 。
*/
public static void updateUsedPercent(Context context) {
if (smallWindow != null) {
TextView percentView = (TextView) smallWindow
.findViewById(R.id.percent);
percentView.setText(getUsedPercentValue(context));
}
}
/**
* ( ) 。
*
* @return true, false。
*/
public static boolean isWindowShowing() {
return smallWindow != null || bigWindow != null;
}
/**
* 。
*
* @return true, false。
*/
public static boolean isReadyToLaunch() {
if ((smallWindowParams.x > launcherParams.x && smallWindowParams.x
+ smallWindowParams.width < launcherParams.x
+ launcherParams.width)
&& (smallWindowParams.y + smallWindowParams.height > launcherParams.y)) {
return true;
}
return false;
}
/**
* WindowManager , WindowManager 。 WindowManager。
*
* @param context
* Context.
* @return WindowManager , 。
*/
private static WindowManager getWindowManager(Context context) {
if (mWindowManager == null) {
mWindowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
}
return mWindowManager;
}
/**
* ActivityManager , ActivityManager 。 ActivityManager。
*
* @param context
* 。
* @return ActivityManager , 。
*/
private static ActivityManager getActivityManager(Context context) {
if (mActivityManager == null) {
mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
}
return mActivityManager;
}
/**
* , 。
*
* @param context
* 。
* @return , 。
*/
public static String getUsedPercentValue(Context context) {
String dir = "/proc/meminfo";
try {
FileReader fr = new FileReader(dir);
BufferedReader br = new BufferedReader(fr, 2048);
String memoryLine = br.readLine();
String subMemoryLine = memoryLine.substring(memoryLine
.indexOf("MemTotal:"));
br.close();
long totalMemorySize = Integer.parseInt(subMemoryLine.replaceAll(
"\\D+", ""));
long availableSize = getAvailableMemory(context) / 1024;
int percent = (int) ((totalMemorySize - availableSize)
/ (float) totalMemorySize * 100);
return percent + "%";
} catch (IOException e) {
e.printStackTrace();
}
return " ";
}
/**
* , 。
*
* @param context
* 。
* @return 。
*/
private static long getAvailableMemory(Context context) {
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
getActivityManager(context).getMemoryInfo(mi);
return mi.availMem;
}
}
MyWindow Manager 는 모든 데스크 톱 부상 창의 관리자 입 니 다.여기 에는 createLauncher(),removeLauncher(),updateLauncher()등 몇 가지 방법 이 추가 되 어 있 습 니 다.각각 로켓 발사 대 부상 창 을 만 들 고 제거 하 며 업데이트 하 는 데 사 용 됩 니 다.또 작은 로켓 이 로켓 발사 대 에 끌 렸 는 지 판단 하 는 데 사용 되 는 isReady ToLaunch()방법 도 추가 됐다.판단 방식 도 간단 하 다.작은 로켓 의 경계 와 로켓 발사 대의 경 계 를 점검 해 교차 여 부 를 판단 하면 된다.다음은 Float Window SmallView 의 코드 를 수정 해 야 합 니 다.손가락 이 부상 창 을 끌 때 작은 로켓 으로 만들어 야 합 니 다.다음 과 같 습 니 다.
public class FloatWindowSmallView extends LinearLayout {
/**
*
*/
public static int windowViewWidth;
/**
*
*/
public static int windowViewHeight;
/**
*
*/
private static int statusBarHeight;
/**
*
*/
private WindowManager windowManager;
/**
*
*/
private LinearLayout smallWindowLayout;
/**
*
*/
private ImageView rocketImg;
/**
*
*/
private WindowManager.LayoutParams mParams;
/**
*
*/
private float xInScreen;
/**
*
*/
private float yInScreen;
/**
*
*/
private float xDownInScreen;
/**
*
*/
private float yDownInScreen;
/**
* View
*/
private float xInView;
/**
* View
*/
private float yInView;
/**
*
*/
private int rocketWidth;
/**
*
*/
private int rocketHeight;
/**
*
*/
private boolean isPressed;
public FloatWindowSmallView(Context context) {
super(context);
windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater.from(context).inflate(R.layout.float_window_small, this);
smallWindowLayout = (LinearLayout) findViewById(R.id.small_window_layout);
windowViewWidth = smallWindowLayout.getLayoutParams().width;
windowViewHeight = smallWindowLayout.getLayoutParams().height;
rocketImg = (ImageView) findViewById(R.id.rocket_img);
rocketWidth = rocketImg.getLayoutParams().width;
rocketHeight = rocketImg.getLayoutParams().height;
TextView percentView = (TextView) findViewById(R.id.percent);
percentView.setText(MyWindowManager.getUsedPercentValue(context));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isPressed = true;
// ,
xInView = event.getX();
yInView = event.getY();
xDownInScreen = event.getRawX();
yDownInScreen = event.getRawY() - getStatusBarHeight();
xInScreen = event.getRawX();
yInScreen = event.getRawY() - getStatusBarHeight();
break;
case MotionEvent.ACTION_MOVE:
xInScreen = event.getRawX();
yInScreen = event.getRawY() - getStatusBarHeight();
//
updateViewStatus();
updateViewPosition();
break;
case MotionEvent.ACTION_UP:
isPressed = false;
if (MyWindowManager.isReadyToLaunch()) {
launchRocket();
} else {
updateViewStatus();
// ,xDownInScreen xInScreen , yDownInScreen yInScreen , 。
if (xDownInScreen == xInScreen && yDownInScreen == yInScreen) {
openBigWindow();
}
}
break;
default:
break;
}
return true;
}
/**
* , 。
*
* @param params
*
*/
public void setParams(WindowManager.LayoutParams params) {
mParams = params;
}
/**
* 。
*/
private void launchRocket() {
MyWindowManager.removeLauncher(getContext());
new LaunchTask().execute();
}
/**
* 。
*/
private void updateViewPosition() {
mParams.x = (int) (xInScreen - xInView);
mParams.y = (int) (yInScreen - yInView);
windowManager.updateViewLayout(this, mParams);
MyWindowManager.updateLauncher();
}
/**
* View , 。
*/
private void updateViewStatus() {
if (isPressed && rocketImg.getVisibility() != View.VISIBLE) {
mParams.width = rocketWidth;
mParams.height = rocketHeight;
windowManager.updateViewLayout(this, mParams);
smallWindowLayout.setVisibility(View.GONE);
rocketImg.setVisibility(View.VISIBLE);
MyWindowManager.createLauncher(getContext());
} else if (!isPressed) {
mParams.width = windowViewWidth;
mParams.height = windowViewHeight;
windowManager.updateViewLayout(this, mParams);
smallWindowLayout.setVisibility(View.VISIBLE);
rocketImg.setVisibility(View.GONE);
MyWindowManager.removeLauncher(getContext());
}
}
/**
* , 。
*/
private void openBigWindow() {
MyWindowManager.createBigWindow(getContext());
MyWindowManager.removeSmallWindow(getContext());
}
/**
* 。
*
* @return 。
*/
private int getStatusBarHeight() {
if (statusBarHeight == 0) {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object o = c.newInstance();
Field field = c.getField("status_bar_height");
int x = (Integer) field.get(o);
statusBarHeight = getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
}
return statusBarHeight;
}
/**
* 。
*
* @author guolin
*/
class LaunchTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// ,
while (mParams.y > 0) {
mParams.y = mParams.y - 10;
publishProgress();
try {
Thread.sleep(8);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
windowManager.updateViewLayout(FloatWindowSmallView.this, mParams);
}
@Override
protected void onPostExecute(Void result) {
// ,
updateViewStatus();
mParams.x = (int) (xDownInScreen - xInView);
mParams.y = (int) (yDownInScreen - yInView);
windowManager.updateViewLayout(FloatWindowSmallView.this, mParams);
}
}
}
코드 에 isPressed 표지 위 치 를 추가 하여 사용자 가 부상 창 을 끌 고 있 는 지 여 부 를 판단 하 는 데 사용 합 니 다.드래그 할 때 updateView Status()방법 을 사용 하여 부상 창의 디 스 플레이 상 태 를 업데이트 합 니 다.이 때 부상 창 은 작은 로켓 이 됩 니 다.그리고 손가락 이 화면 을 떠 날 때 도 updateView Status()방법 을 사용 합 니 다.이 때 isPressed 가 false 인 것 을 발견 하면 현탁 창 을 다시 표시 합 니 다.또한 손가락 이 화면 을 떠 날 때 마 이 윈도 매니저 의 isReady ToLaunch()방법 으로 작은 로켓 이 로켓 발사 대 에 끌 려 갔 는 지,트 루 라면 로켓 이 하늘 로 올 라 가 는 애니메이션 효 과 를 촉발 할 수 있다.로켓 이 하늘 로 올 라 가 는 애니메이션 실현 은 LaunchTask 라 는 임무 에 쓰 여 있 습 니 다.doInBackground()방법 에서 시간 소모 논 리 를 수행 하고 작은 로켓 의 세로 좌 표를 계속 줄 여 상승 효 과 를 실현 할 수 있 습 니 다.세로 좌표 가 0 으로 줄 어 들 면 로켓 이 하늘 로 올 라 가 는 애니메이션 이 끝나 고 onPost Execute()방법 에서 부상 창 을 다시 표시 합 니 다.
또한 AndroidManifest.xml 파일 에서 두 가지 권한 을 설명 하 는 것 을 기억 하 십시오.다음 과 같 습 니 다.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_TASKS" />
코드 가 이 정도 밖 에 없 으 니 다음 에 우리 실행 해서 효 과 를 봅 시다.메 인 인터페이스 에서 Start Float Window 단 추 를 누 르 면 부상 창 을 열 고 데스크 톱 으로 돌아 갈 수 있 습 니 다.그리고 부상 창 을 끌 면 작은 로켓 상태 가 되 어 화면 아래쪽 로켓 발사 대 에 끌 고 놓 으 면 작은 로켓 이 하늘 로 올 라 갑 니 다.다음 그림 에서 보 듯 이:
자,오늘 의 설명 은 여기까지 입 니 다.작은 로켓 의 이륙 과 함께 올해 의 마지막 글 도 끝 났 습 니 다.
새로운 한 해 가 곧 다가 올 것 입 니 다.여러분 들 이 앞으로 1 년 동안 일 을 하 든 공 부 를 하 든 모두 이 작은 로켓 처럼 비약 하여 새로운 높이 에 이 를 수 있 기 를 기원 합 니 다!2014 년,우 리 는 계속 공동으로 노력 합 니 다!
원본 다운로드,여 기 를 클릭 하 세 요.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.