android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示
来源:互联网 发布:qq淘宝优惠群怎么做 编辑:程序博客网 时间:2024/06/07 01:42
1:首先来说横竖屏的问题
这里我是在onCreate方法中直接强制横屏竖屏的设置,
Button btn;SurfaceView surfaceView;//初始化布局protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); addListener(); } //初始化private void init() { btn = (Button) findViewById(R.id.btn);//用来控制横竖屏的 surfaceView = (SurfaceView) findViewById(R.id.sv); if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { setOrientation_Port(); } else { setOrientation_Land(); } } //增加监听事件 private void addListener() { btn.setOnClickListener(new BtnClick()); } //监听事件的实施 class BtnClick implements OnClickListener { @Override public void onClick(View v) { if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setOrientation_Land(); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setOrientation_Port(); } } } // 获取屏幕宽高 public void getwidth() { WindowManager wm = this.getWindowManager(); width = wm.getDefaultDisplay().getWidth(); heigh = wm.getDefaultDisplay().getHeight(); } // 竖屏设置 public void setOrientation_Port() { getwidth(); int sv_width = width; int sv_heigth = 2 * (heigh / 5); RelativeLayout.LayoutParams cameraFL = new RelativeLayout.LayoutParams( width, heigh); cameraFL.setMargins(0, 0, 0, sv_heigth); surfaceView.setLayoutParams(cameraFL); } //横屏设置 public void setOrientation_Land() { getwidth(); RelativeLayout.LayoutParams cameraFL = new RelativeLayout.LayoutParams( width, heigh); cameraFL.setMargins(0, 0, 0, 0); surfaceView.setLayoutParams(cameraFL); } 这样就实现了通过点击按钮来实现横竖屏的切换。
2:自定义surfaceView的写法来实现动画的效果
Canvas(中文叫做”画布”)就和HTML5中的canvas标签一样可以在一定区域内自由绘制图形。Canvas+SurfaceView制作的动画与View Animation和Property Animation这类动画比起来更加适合大量的集中播放的动画,比如游戏画面、相机的图像显示等。
因为SurfaceView通常会在另一个专门的线程中不断重绘界面,所以不像其他动画那样要在主线程(UI线程)中播放动画的同时还要消耗一定的流畅度用来响应用户输入。
注意: canvas.rotate() .旋转是针对于x和y坐标的(0,0)点的,x和y轴是会旋转的,
还有一个旋转方法是canvas.rotate(90,x,y);就是绕x,y点旋转
package com.example.test1;import java.io.IOException;import java.io.InputStream;import android.content.Context;import android.content.res.AssetManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff.Mode;import android.util.AttributeSet;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class GIFView extends SurfaceView implements SurfaceHolder.Callback, Runnable { // 上下文 @SuppressWarnings("unused") private Context context; // 线程运行标志 public static boolean flag = false; // 画布 private Canvas canvas; // holder对象 private SurfaceHolder holder; // 画笔 private Paint paint; // gif帧标志量 private int count = 0; private Thread thread; // 初始宽高 private int w = 0, h = 0; // 方向 public static int oritation = 0; // 刷新间隔 private static int delay_During = 300; // 旋转角度 private static int rotate_r = 90; private static int rotate_R = 180; // 旋转矢量 private static int rotate_Left = 15; private static int rotate_right = 60; // 动画位置距离屏幕边界的量 private static int speed_w = 100; private static int speed_h = 160; private int width,height; public GIFView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.context = context; this.holder = this.getHolder(); holder.addCallback(this); paint = new Paint(); paint.setColor(0xFFFFFFFF); setFocusable(true); // 设置背景透明 setZOrderOnTop(true); holder.setFormat(PixelFormat.TRANSLUCENT); }//一旦surfaceView发生改变线程就启动不断的画,直到surfaceView销毁 @Override public void run() { // TODO Auto-generated method stub while (flag) { long start = System.currentTimeMillis(); drawView(); long end = System.currentTimeMillis(); try { if (end - start < delay_During) { Thread.sleep(delay_During - (end - start)); } } catch (Exception e) { // TODO: handle exception } } } /** * 从Assets中读取图 片 */ private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; AssetManager am = getResources().getAssets(); try { InputStream is = am.open(fileName); image = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; } // 画图 --利用矢量和角度来实现图片的方向的改变 ,由于四张图片组成一个向右的动画效果,所以需要通过旋转来实现8个不同的方向 private void drawView() { // TODO Auto-generated method stub try { canvas = holder.lockCanvas(); if (canvas != null) { // 设置透明 canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); paint.setColor(0xFFFFFFFF); // 将整个画布移动 canvas.translate(50, 60); switch (oritation) { case 0: { } break; case 1: { canvas.save(); //canvas.rotate(90,x,y);就是绕x,y点旋转 canvas.rotate(rotate_R, 0, h / 2); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), 0 - rotate_right, h / 2 - rotate_Left, paint); canvas.restore(); } break; case 2: { canvas.save(); canvas.rotate(-rotate_r, w / 2 - rotate_Left, rotate_right); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w / 2 - rotate_Left, rotate_right, paint); canvas.restore(); } break; case 3: { canvas.save(); canvas.rotate(0, w, h / 2); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - rotate_right, h / 2 - rotate_Left, paint); canvas.restore(); } break; case 4: { canvas.save(); canvas.rotate(rotate_r, w / 2, h); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w / 2 - rotate_right, h - rotate_Left, paint); canvas.restore(); } break; case 5: { canvas.save(); canvas.rotate(-135, 30, rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), -10, -10, paint); canvas.restore(); } break; case 6: { canvas.save(); canvas.rotate(-45, w - 30, rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - rotate_right, 10, paint); canvas.restore(); } break; case 7: { canvas.save(); canvas.rotate(45, w - rotate_right, h - rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - 70, h - rotate_right, paint); canvas.restore(); } break; case 8: { canvas.save(); canvas.rotate(135, 0, h); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), -70, h - rotate_Left, paint); canvas.restore(); } break; count++; if (count == 4) { count = 0; } } } catch (Exception e) { } finally { if (canvas != null) { holder.unlockCanvasAndPost(canvas); } } } // Callback包含的方法 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub // 初始化并启动线程 w = this.getWidth() - speed_w; h = this.getHeight() - speed_h; flag = true; thread = new Thread(this); thread.start(); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub // 停止线程 flag = false; }}
3:思想
底层是一个surfaceView处理触屏的事件,上面还有一层自定义的surfaceView设置为透明,底层的surfaceView向最上一层传递参数,来实现滑动不同的方向出发不同的动画效果
整体代码如下
xml代码:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rl" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.test1.MainActivity" android:configChanges="keyboardHidden|orientation" > <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="@string/btn" /> <ImageButton android:id="@+id/imgBtn" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:background="@drawable/cfg_ptz" /> <RelativeLayout android:id="@+id/rl_small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" > <SurfaceView android:id="@+id/sv" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/animation_list" /> <com.example.test1.GIFView android:id="@+id/gif_View" android:layout_width="wrap_content" android:layout_height="300dp" /> </RelativeLayout></RelativeLayout>底层的surfaceView代码package com.example.test1;import android.app.Activity;import android.content.pm.ActivityInfo;import android.graphics.drawable.AnimationDrawable;import android.os.Bundle;import android.util.Log;import android.view.MotionEvent;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.widget.Button;import android.widget.ImageButton;import android.widget.RelativeLayout;public class MainActivity extends Activity { Button btn; SurfaceView surfaceView; RelativeLayout relativeLayout; RelativeLayout relativeLayout2; // surfaceView的大小设置 private int width; private int heigh; // 判断滑动的方向 private int x_down, y_down; private int x_space, y_space; // 方向的表示 public static final int TO_LEFT = 1; public static final int TO_UP = 2; public static final int TO_RIGHT = 3; public static final int TO_DOWN = 4; public static final int TO_LEFTUP = 5; public static final int TO_RIGHTUP = 6; public static final int TO_RIGHTDOWN = 7; public static final int TO_LEFTDOWN = 8; // 用于点击事件的效果 public static final int TO_CLICK = 9; // 用于显示八个方向 public static final int TO_All = 10; // 自定义view private GIFView gif_View; // 标志位 boolean flag; public static final int parm = 1; private static final OnClickListener ImgListener = null; private ImageButton imageButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); addListener(); } // 初始化 private void init() { btn = (Button) findViewById(R.id.btn); surfaceView = (SurfaceView) findViewById(R.id.sv); relativeLayout = (RelativeLayout) findViewById(R.id.rl); gif_View = (GIFView) findViewById(R.id.gif_View); gif_View.setVisibility(View.VISIBLE); relativeLayout2 = (RelativeLayout) findViewById(R.id.rl_small); imageButton = (ImageButton) findViewById(R.id.imgBtn); if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { setOrientation_Port(); gif_View.setVisibility(View.INVISIBLE); } else { setOrientation_Land(); gif_View.setVisibility(View.INVISIBLE); } btn.bringToFront(); imageButton.bringToFront(); } // 点击事件 class BtnClick implements OnClickListener { @Override public void onClick(View v) { if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setOrientation_Land(); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setOrientation_Port(); } } } // 竖屏设置 public void setOrientation_Port() { getwidth(); int sv_width = width; int sv_heigth = 2 * (heigh / 5); RelativeLayout.LayoutParams cameraFL = new RelativeLayout.LayoutParams( width, heigh); cameraFL.setMargins(0, 0, 0, sv_heigth); surfaceView.setLayoutParams(cameraFL); } // 获取屏幕宽高 public void getwidth() { WindowManager wm = this.getWindowManager(); width = wm.getDefaultDisplay().getWidth(); heigh = wm.getDefaultDisplay().getHeight(); } // 横屏设置 public void setOrientation_Land() { getwidth(); RelativeLayout.LayoutParams cameraFL = new RelativeLayout.LayoutParams( width, heigh); cameraFL.setMargins(0, 0, 0, 0); surfaceView.setLayoutParams(cameraFL); } private void addListener() { btn.setOnClickListener(new BtnClick()); surfaceView.setOnTouchListener(new onTouch()); imageButton.setOnClickListener(new ImgListener()); } private class ImgListener implements OnClickListener { @Override public void onClick(View v) { gif_View.oritation = TO_All; Log.e("TAG", "-----------------tupian"); gif_View.setVisibility(View.VISIBLE); } } // 触屏事件的实施 private class onTouch implements OnTouchListener { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: x_down = (int) event.getX(); y_down = (int) event.getY(); flag = true; Log.i("TAG--ACTION_DOWN", x_down + "-------------------" + y_down); gif_View.oritation = TO_CLICK; gif_View.setVisibility(View.VISIBLE); break; case MotionEvent.ACTION_MOVE: if (flag) { int x = (int) event.getX(); int y = (int) event.getY(); Log.i("TAG--ACTION_MOVE", x + "-------------------" + y); x_space = (int) (event.getX() - x_down); y_space = (int) (event.getY() - y_down); Log.i("TAG--ACTION_UP", x_space + "-------------------" + y_space); if (Math.abs(x_space) < 50 | Math.abs(y_space) < 50) { gif_View.oritation = TO_CLICK; gif_View.setVisibility(View.VISIBLE); } if (Math.abs(x_space) > 100 | Math.abs(y_space) > 100) { // 确定不是点击事件 if (y_space < 0 & x_space > -30 & x_space < 30) { // 向上 // 向上 flag = false; Log.i("TAG", "向上"); gif_View.oritation = TO_UP; gif_View.setVisibility(View.VISIBLE); } if (y_space < -35 & x_space > 50) { // 向右上 flag = false; Log.e("TAG", " 右上"); gif_View.oritation = TO_RIGHTUP; gif_View.setVisibility(View.VISIBLE); } if (y_space < -35 & x_space < -50) { // 左上 flag = false; Log.e("TAG", "左上"); gif_View.oritation = TO_LEFTUP; gif_View.setVisibility(View.VISIBLE); } // ------------------------------------- if (y_space > 0 & x_space < 30 & x_space > -30) { // 向下 flag = false; Log.e("TAG", " 向下"); gif_View.oritation = TO_DOWN; gif_View.setVisibility(View.VISIBLE); } if (y_space > 35 & x_space < -35) { // 左下 flag = false; Log.e("TAG", "左下"); gif_View.oritation = TO_LEFTDOWN; gif_View.setVisibility(View.VISIBLE); } if (y_space > 35 & x_space > 35) { // 右下 flag = false; Log.e("TAG", "右下"); gif_View.oritation = TO_RIGHTDOWN; gif_View.setVisibility(View.VISIBLE); } if (x_space < 0 & -30 < y_space & y_space < 30) { // 向左 flag = false; Log.e("TAG", "向左"); gif_View.oritation = TO_LEFT; gif_View.setVisibility(View.VISIBLE); } if (x_space > 0 & -30 < y_space & y_space < 30) { // 向右 flag = false; Log.e("TAG", "向右"); gif_View.oritation = TO_RIGHT; gif_View.setVisibility(View.VISIBLE); } } } break; case MotionEvent.ACTION_UP: gif_View.setVisibility(View.INVISIBLE); break; default: break; } return true; } }}透明的surfaceView代码package com.example.test1;import java.io.IOException;import java.io.InputStream;import android.content.Context;import android.content.res.AssetManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff.Mode;import android.util.AttributeSet;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class GIFView extends SurfaceView implements SurfaceHolder.Callback, Runnable { // 上下文 @SuppressWarnings("unused") private Context context; // 线程运行标志 public static boolean flag = false; // 画布 private Canvas canvas; // holder对象 private SurfaceHolder holder; // 画笔 private Paint paint; // gif帧标志量 private int count = 0; private Thread thread; // 初始宽高 private int w = 0, h = 0; // 方向 public static int oritation = 0; // 刷新间隔 private static int delay_During = 300; // 旋转角度 private static int rotate_r = 90; private static int rotate_R = 180; // 旋转矢量 private static int rotate_Left = 15; private static int rotate_right = 60; // 动画位置距离屏幕边界的量 private static int speed_w = 100; private static int speed_h = 160; private int width,height; public GIFView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.context = context; this.holder = this.getHolder(); holder.addCallback(this); paint = new Paint(); paint.setColor(0xFFFFFFFF); setFocusable(true); // 设置背景透明 setZOrderOnTop(true); holder.setFormat(PixelFormat.TRANSLUCENT); } @Override public void run() { // TODO Auto-generated method stub while (flag) { long start = System.currentTimeMillis(); drawView(); long end = System.currentTimeMillis(); try { if (end - start < delay_During) { Thread.sleep(delay_During - (end - start)); } } catch (Exception e) { // TODO: handle exception } } } /** * 从Assets中读取图 片 */ private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; AssetManager am = getResources().getAssets(); try { InputStream is = am.open(fileName); image = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; } // 画图 --利用矢量和角度来实现图片的方向的改变 private void drawView() { // TODO Auto-generated method stub try { canvas = holder.lockCanvas(); if (canvas != null) { // 设置透明 canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR); paint.setColor(0xFFFFFFFF); // 将整个画布移动 canvas.translate(50, 60); switch (oritation) { case 0: { } break; case 1: { //向左 canvas.save(); canvas.rotate(rotate_R, 0, h / 2); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), 0 - rotate_right, h / 2 - rotate_Left, paint); canvas.restore(); } break; case 2: { canvas.save(); canvas.rotate(-rotate_r, w / 2 - rotate_Left, rotate_right); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w / 2 - rotate_Left, rotate_right, paint); canvas.restore(); } break; case 3: { canvas.save(); canvas.rotate(0, w, h / 2); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - rotate_right, h / 2 - rotate_Left, paint); Log.e("TAG", "--------------------333333"); canvas.restore(); } break; case 4: { canvas.save(); canvas.rotate(rotate_r, w / 2, h); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w / 2 - rotate_right, h - rotate_Left, paint); canvas.restore(); } break; case 5: { canvas.save(); canvas.rotate(-135, 30, rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), -10, -10, paint); canvas.restore(); } break; case 6: { canvas.save(); canvas.rotate(-45, w - 30, rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - rotate_right, 10, paint); canvas.restore(); } break; case 7: { canvas.save(); canvas.rotate(45, w - rotate_right, h - rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - 70, h - rotate_right, paint); canvas.restore(); } break; case 8: { canvas.save(); canvas.rotate(135, 0, h); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), -70, h - rotate_Left, paint); canvas.restore(); } break; case 9: { Log.e("TAG","---------------9999999999-----------------"); canvas.save(); canvas.drawBitmap(getImageFromAssetsFile("b" + count + ".png"), 200,300, paint); Log.e("TAG","---------------9999999999"); canvas.restore(); } break; case 10: { Log.e("TAG","---------------10-----------------"); canvas.save(); canvas.rotate(rotate_R, 0, h / 2); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), 0 - rotate_right, h / 2 - rotate_Left, paint); canvas.restore(); canvas.save(); canvas.rotate(-rotate_r, w / 2 - rotate_Left, rotate_right); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w / 2 - rotate_Left, rotate_right, paint); canvas.restore(); canvas.save(); canvas.rotate(0, w, h / 2); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - rotate_right, h / 2 - rotate_Left, paint); Log.e("TAG", "--------------------333333"); canvas.restore(); canvas.save(); canvas.rotate(rotate_r, w / 2, h); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w / 2 - rotate_right, h - rotate_Left, paint); canvas.restore(); canvas.save(); canvas.rotate(-135, 30, rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), -10, -10, paint); canvas.restore(); canvas.save(); canvas.rotate(-45, w - 30, rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - rotate_right, 10, paint); canvas.restore(); canvas.save(); canvas.rotate(45, w - rotate_right, h - rotate_Left); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), w - 70, h - rotate_right, paint); canvas.restore(); canvas.save(); canvas.rotate(135, 0, h); canvas.drawBitmap(getImageFromAssetsFile("a" + count + ".png"), -70, h - rotate_Left, paint); canvas.restore(); } break; } count++; if (count == 4) { count = 0; } } } catch (Exception e) { } finally { if (canvas != null) { holder.unlockCanvasAndPost(canvas); } } } // Callback包含的方法 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub // 初始化并启动线程 w = this.getWidth() - speed_w; h = this.getHeight() - speed_h; flag = true; thread = new Thread(this); thread.start(); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub // 停止线程 flag = false; }}
小弟也是刚刚接触android的具体项目 :上述如果有不对的地方欢迎留言,修改!
2 0
- android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示
- Android系统实现横竖屏两方向自动旋转的方法
- 浅谈Android动画中点击事件的捕捉
- android 横竖屏事件
- Android 去掉横竖屏切换时的转屏动画
- 解决屏幕横屏时的2个方向翻转(非横竖屏切换)
- android如何改变默认横竖屏方向
- Android之屏幕方向|显示方式|Activity重建问题|横竖屏切换不同的布局
- js 的时间的横竖屏事件
- Unity 滑动事件6个方向的实现
- Android横竖屏的问题
- Android横竖屏的设置
- Android 横竖屏的锁定
- android的横竖屏切换
- Android的横竖屏切换
- Android应用:实现全屏和固定横竖屏的方法
- Android实现横竖屏、全屏的几种方式
- iPad Android系统下,平板设备判断横竖屏,以及横竖屏变化之后的事件触发(html + javascript)
- 运算符练习小程序
- 可重入函数与线程安全的区别与联系
- CodeForces #1 C. Ancient Berland Circus(两种解法...
- Linux的进程/线程间通信方式
- 如何避免OOM 异常?
- android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示
- 直播,一位大神带来的福利!
- Apache Spark DataFrames入门指南:操作DataFrame
- [unity]NGUI实现背包拖拽+使用EventDelegate回调
- 16.7.17 C组总结
- Windows下安装Redis
- 8086汇编语言 Q命令退出debug
- 【NOIP2016提高A组模拟7.17】寻找
- matlab绘制 三维剖面图