Java法式完成導出Excel的辦法(支撐IE低版本)。本站提示廣大學習愛好者:(Java法式完成導出Excel的辦法(支撐IE低版本))文章只能為提供參考,不一定能成為您想要的結果。以下是Java法式完成導出Excel的辦法(支撐IE低版本)正文
關於Android 的手勢不但在軟件中會常常用到,好比閱讀器中的翻頁,轉動頁面等等;固然其其實我們開辟Android游戲的時刻加上了Android手勢操作更會讓游戲增長一個亮點,好比普通的CAG、PUZ等類型的游戲選擇關卡、簡略配景的挪動等,都可使用手勢來操作便可,相似前段時光很火的《惱怒的小鳥》,小鳥這個游戲確切不錯,我所看到的獨一的亮點是這款游戲的創意!說真話,如今的游戲沒有做不出來的只要想不出來的好創意。回到話題來,那末上面我們來懂得下甚麼是Android 手勢!
手勢辨認概述
所謂手勢操作,相似舞蹈機、EZdancer等這些應用分歧舉措和音符讓人載歌載舞一樣,那末Android這裡的手勢只是讓我們在游戲和軟件中的操作有了更多的名堂和弄法,依據玩家接觸屏幕時光的長短,在屏幕上滑動的間隔,按下抬起的時光等停止了包裝,其實就是Android 對觸屏處置做了包裝和處置。
那末在Android中其實有兩種手勢辨認技巧。一種是觸摸屏手勢辨認,另外一種是輸出法手勢辨認。二者比擬起來第二種比擬靈巧,可以自界說手勢,比擬high!那末這一節我們先來引見第一種手勢辨認:觸摸屏手勢辨認。鄙人篇博文中我會給童鞋們講授輸出法手勢辨認!
手勢辨認實例
先把兩張截圖放下去吧:
OK,先上代碼:
MySurfaceView.java
Java代碼
package com.himi;
import java.util.Vector;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnTouchListener;
/**
*@author Himi
*@ Gesture (上文)觸摸屏手勢辨認
*/
public class MySurfaceViewAnimation extends SurfaceView implements Callback,
Runnable, OnGestureListener, OnTouchListener {
private Thread th = new Thread(this);
private SurfaceHolder sfh;
private Canvas canvas;
private Paint paint;
private Bitmap bmp;
private GestureDetector gd;
private int bmp_x, bmp_y;
private boolean isChagePage;
private Vector<String> v_str;// 備注1
public MySurfaceViewAnimation(Context context) {
super(context);
v_str = new Vector<String>();
this.setKeepScreenOn(true);
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.himi_dream);
sfh = this.getHolder();
sfh.addCallback(this);
paint = new Paint();
paint.setAntiAlias(true);
this.setLongClickable(true);
// setLongClickable( true )是必需的,由於 只要如許,
// 我們以後的SurfaceView(view)能力夠處置分歧於觸屏情勢;
// 例如:ACTION_MOVE,或許多個ACTION_DOWN
this.setOnTouchListener(this);// 將本類綁定觸屏監聽器
gd = new GestureDetector(this);
gd.setIsLongpressEnabled(true);
}
public void surfaceCreated(SurfaceHolder holder) {
// 當體系挪用了此辦法才創立了view所以在這裡能力取到view的寬高!!有些童鞋老是把器械都放在初始化函數裡!
// 線程最好放在這裡來啟動,由於放在初始化裡的畫,那view還沒有呢,到了提交畫布unlockCanvasAndPost的時刻就異常啦!
bmp_x = (getWidth() - bmp.getWidth()) >> 2;
bmp_y = (getHeight() - bmp.getHeight()) >> 2;
th.start();
}
public void draw() {
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.WHITE);// 畫布刷屏
canvas.drawBitmap(bmp, bmp_x, bmp_y, paint);
paint.setTextSize(20);// 設置文字年夜小
paint.setColor(Color.WHITE);
//這裡畫出一個矩形便利童鞋們看得手勢操作挪用的函數都是哪些
canvas.drawRect(50, 30, 175,120, paint);
paint.setColor(Color.RED);// 設置文字色彩
if (v_str != null) {
for (int i = 0; i < v_str.size(); i++) {
canvas.drawText(v_str.elementAt(i), 50, 50 + i * 30,
paint);
}
}
}
} catch (Exception e) {
Log.v("Himi", "draw is Error!");
} finally {
sfh.unlockCanvasAndPost(canvas);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
draw();
try {
Thread.sleep(100);
} catch (Exception ex) {
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
// @Override
// public boolean onTouchEvent(MotionEvent event) {// 備注2
// return true;
// }
@Override
public boolean onTouch(View v, MotionEvent event) {// 備注3
if (v_str != null)
v_str.removeAllElements();
return gd.onTouchEvent(event);// 備注4
}
// --------------以下是應用OnGestureListener手勢監聽的時刻重寫的函數---------
/**
* @以下辦法中的參數說明:
* @e1:第1個是 ACTION_DOWN MotionEvent 按下的舉措
* @e2:後一個是ACTION_UP MotionEvent 抬起的舉措(這裡要看下備注5的說明)
* @velocityX:X軸上的挪動速度,像素/秒
* @velocityY:Y軸上的挪動速度,像素/秒
*/
@Override
public boolean onDown(MotionEvent e) {
// ACTION_DOWN
v_str.add("onDown");
return false;
}
@Override
// ACTION_DOWN 、短按不挪動
public void onShowPress(MotionEvent e) {
v_str.add("onShowPress");
}
@Override
// ACTION_DOWN 、長按不滑動
public void onLongPress(MotionEvent e) {
v_str.add("onLongPress");
}
@Override
// ACTION_DOWN 、慢滑動
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
v_str.add("onScroll");
return false;
}
@Override
// ACTION_DOWN 、快滑動、 ACTION_UP
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
v_str.add("onFling");
//-------備注5----------
// if(e1.getAction()==MotionEvent.ACTION_MOVE){
// v_str.add("onFling");
// }else if(e1.getAction()==MotionEvent.ACTION_DOWN){
// v_str.add("onFling");
// }else if(e1.getAction()==MotionEvent.ACTION_UP){
// v_str.add("onFling");
// }
// if(e2.getAction()==MotionEvent.ACTION_MOVE){
// v_str.add("onFling");
// }else if(e2.getAction()==MotionEvent.ACTION_DOWN){
// v_str.add("onFling");
// }else if(e2.getAction()==MotionEvent.ACTION_UP){
// v_str.add("onFling");
// }
if (isChagePage)
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.himi_dream);
else
bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.himi_warm);
isChagePage = !isChagePage;
return false;
}
@Override
// 短按ACTION_DOWN、ACTION_UP
public boolean onSingleTapUp(MotionEvent e) {
v_str.add("onSingleTapUp");
return false;
}
}
彌補一下:代碼初始化手勢的時刻有這麼一句:gd.setIsLongpressEnabled(true);這個函數標識,假如你設置true的話就是開啟了長按鍵,當你長時光觸屏不動就可以獲得 onLongPress 手勢,假如設置false,那末你長時光觸屏不挪動也得不到這個手勢的支撐。此函數不設置也默許設置為true。
備注1:
這裡我只是給一些不太熟習這類界說Vector方法的童鞋簡略引見一下:我們普通界說容器的時刻都是直接 Vector vc =new Vector();,嗯,沒錯,然則這類Vector<String>的界說是種泛型界說,那末簡略的說下差別,假如Vector vc =new Vector();這類方法裝入Object的今後,取的時刻是否是要把掏出的停止強轉一下類型?! 呵呵,而Vector<String>這類界說的時刻就注解了這個容器我只裝String類型的元素,so~掏出的時刻也不消再去強轉了。
備注2:
經由過程測試發明,這裡依然呼應觸屏事宜,即便你把觸屏核心設置成setFocusableInTouchMode(false)也會挪用!緣由是由於我們本類的view綁定了觸屏事宜監聽器,那末確定會先呼應備注3,然後我們備注4這裡沒有 return true 而是直接返給了手勢監聽器去監聽,讓監聽器找適合的函數來處置用戶的手勢,也就是說沒有標記處置完成,所以我們的重寫的onTouchEvent()也會持續行止理!
備注5:
這裡正文的代碼我是在測試兩個舉措究竟是哪兩個,由於網上引見Android手勢帖子都瘋傳說:
第一個是MotionEvent.ACTION_DOWN,第二個是MotionEvent.ACTION_MOVE。那末第一個舉措是按下好懂得,是玩家剛觸屏的舉措,第二個是move!豈非是挪動的點都記載上去了??
其實測試成果發明:
第一個是MotionEvent.ACTION_DOWN,第二個是MotionEvent.ACTION_UP!
唉~如今網上的帖子真是各類剽竊~就不克不及測試下??愁悶! 既然這兩個舉措一個是按下一個是抬起那就很明白其意義了,我們可以依據這兩個舉措曉得用戶究竟滑動的間隔等等了,其間隔e2.getX()-e1.getX()。
總結
1、觸屏後、一向觸屏不動、演化次序:onDown->onShowPress->onLongPress;
2、觸屏後、一向觸屏慢挪動是onScroll/快挪動是onFling 、手指分開屏幕;
留意 :觸屏後、一向觸屏挪動,假如手指不分開屏幕一向都是onScroll,不論你挪動的速度多快,永久不會是onFling!
Ok,手勢固然挺簡略的,然則假如闇練來應用而且參加游戲中確定讓你的Game減色很多。
這個實例我只做了一個手勢的處置,由於其他的舉措都很簡略就不多說了。
彌補內容:
網上許多關於手勢文章都說Android 敵手勢的支撐是從SDK 1.6 (也就是 API 4)才開端的,然則我用SDK1.5模仿器也能辨認!(本想測試下更低的SDK的支撐後果,然則我沒有SDK低於1.5版本的),所以查了Api 發明:
android.view.GestureDetector.OnGestureListener; since api-1 ,
android.view.GestureDetector; since api-1 ,
從API來看從api-1開端就曾經支撐手勢和手勢監聽器了,那末許多說api-4才支撐這句話也沒錯!由於:android.gesture 這個類是從 api-4才開端支撐的,這個類輸出法手勢辨認中會用到。
結論:觸摸屏手勢辨認是從API-1 就開端支撐了。 而輸出法手勢辨認是API-4才開端支撐的!這裡要弄清晰!
以上就是對Android 完成手勢操作切換圖片的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!