① android頁面之間切換的轉場動畫(主題設置)
概述:隨著Android手機的更新迭代,高版本自帶轉場動畫,但是為了跟好的用戶體驗,以及產品差異化的體現,如果產品需要我們自己設計一套轉場動畫,我們又該如何實現呢
當然轉場動畫的實現方式有多種,接下來我們來實現一款全局的轉場動畫,也就是通過設置主題來達到轉場動畫的效果
首先我們需要准備在res文件下新建anim文件包,然後分別創建slide_in_from_right 、slide_out_to_left slide_out_to_right、slide_in_from_left的xml文件
首先當我們跳轉到一個新的Activity,讓新的Activity從右邊的屏幕進入,被跳轉的Activity界面從當前位置向左邊移出屏幕
文件分別是slide_in_from_right,slide_out_to_left,此時是Activity被打開的情況下
關閉當前界面,當前的Activity從顯示位置向右移出屏幕,被展示的Activity從屏幕的左邊進入到屏幕,此時的文件分別是slide_out_to_right,slide_in_from_left
接著上面的分析,我們在具體的編寫上面的文件就容易多了
首先 slide_in_from_right.xml
接著 slide_out_to_left.xml
slide_out_to_right.xml
slide_in_from_left.xml
現在上面的四個文件都寫完了,接下來我們來使用下上面的文件
這樣我們的轉場動畫也就實現呢,但千萬別忘了最後一步,我們需要把上面的style配置的放進我們的主題,接下來我們在我們已有的主題下寫入以下的配置
這樣我們的主題也就設置成功了....
② android 如何實現邊緣拖動側滑
據需求需要自己自定義一個ListView來實現該功能,接下來先貼出代碼再講解具體的實現
package com.example.slidecutlistview;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Scroller;
/**
* @blog http://blog.csdn.net/xiaanming
*
* @author xiaanming
*
*/
public class SlideCutListView extends ListView {
/**
* 當前滑動的ListViewposition
*/
private int slidePosition;
/**
* 手指按下X的坐標
*/
private int downY;
/**
* 手指按下Y的坐標
*/
private int downX;
/**
* 屏幕寬度
*/
private int screenWidth;
/**
* ListView的item
*/
private View itemView;
/**
* 滑動類
*/
private Scroller scroller;
private static final int SNAP_VELOCITY = 600;
/**
* 速度追蹤對象
*/
private VelocityTracker velocityTracker;
/**
* 是否響應滑動,默認為不響應
*/
private boolean isSlide = false;
/**
* 認為是用戶滑動的最小距離
*/
private int mTouchSlop;
/**
* 移除item後的回調介面
*/
private RemoveListener mRemoveListener;
/**
* 用來指示item滑出屏幕的方向,向左或者向右,用一個枚舉值來標記
*/
private RemoveDirection removeDirection;
// 滑動刪除方向的枚舉值
public enum RemoveDirection {
RIGHT, LEFT;
}
public SlideCutListView(Context context) {
this(context, null);
}
public SlideCutListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlideCutListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
scroller = new Scroller(context);
mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
/**
* 設置滑動刪除的回調介面
* @param removeListener
*/
public void setRemoveListener(RemoveListener removeListener) {
this.mRemoveListener = removeListener;
}
/**
* 分發事件,主要做的是判斷點擊的是那個item, 以及通過postDelayed來設置響應左右滑動事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
addVelocityTracker(event);
// 假如scroller滾動還沒有結束,我們直接返回
if (!scroller.isFinished()) {
return super.dispatchTouchEvent(event);
}
downX = (int) event.getX();
downY = (int) event.getY();
slidePosition = pointToPosition(downX, downY);
// 無效的position, 不做任何處理
if (slidePosition == AdapterView.INVALID_POSITION) {
return super.dispatchTouchEvent(event);
}
// 獲取我們點擊的item view
itemView = getChildAt(slidePosition - getFirstVisiblePosition());
break;
}
case MotionEvent.ACTION_MOVE: {
if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
|| (Math.abs(event.getX() - downX) > mTouchSlop && Math
.abs(event.getY() - downY) < mTouchSlop)) {
isSlide = true;
}
break;
}
case MotionEvent.ACTION_UP:
recycleVelocityTracker();
break;
}
return super.dispatchTouchEvent(event);
}
/**
* 往右滑動,getScrollX()返回的是左邊緣的距離,就是以View左邊緣為原點到開始滑動的距離,所以向右邊滑動為負值
*/
private void scrollRight() {
removeDirection = RemoveDirection.RIGHT;
final int delta = (screenWidth + itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, -delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}
/**
* 向左滑動,根據上面我們知道向左滑動為正值
*/
private void scrollLeft() {
removeDirection = RemoveDirection.LEFT;
final int delta = (screenWidth - itemView.getScrollX());
// 調用startScroll方法來設置一些滾動的參數,我們在computeScroll()方法中調用scrollTo來滾動item
scroller.startScroll(itemView.getScrollX(), 0, delta, 0,
Math.abs(delta));
postInvalidate(); // 刷新itemView
}
/**
* 根據手指滾動itemView的距離來判斷是滾動到開始位置還是向左或者向右滾動
*/
private void scrollByDistanceX() {
// 如果向左滾動的距離大於屏幕的三分之一,就讓其刪除
if (itemView.getScrollX() >= screenWidth / 3) {
scrollLeft();
} else if (itemView.getScrollX() <= -screenWidth / 3) {
scrollRight();
} else {
// 滾回到原始位置,為了偷下懶這里是直接調用scrollTo滾動
itemView.scrollTo(0, 0);
}
}
/**
* 處理我們拖動ListView item的邏輯
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
addVelocityTracker(ev);
final int action = ev.getAction();
int x = (int) ev.getX();
switch (action) {
case MotionEvent.ACTION_MOVE:
int deltaX = downX - x;
downX = x;
// 手指拖動itemView滾動, deltaX大於0向左滾動,小於0向右滾
itemView.scrollBy(deltaX, 0);
break;
case MotionEvent.ACTION_UP:
int velocityX = getScrollVelocity();
if (velocityX > SNAP_VELOCITY) {
scrollRight();
} else if (velocityX < -SNAP_VELOCITY) {
scrollLeft();
} else {
scrollByDistanceX();
}
recycleVelocityTracker();
// 手指離開的時候就不響應左右滾動
isSlide = false;
break;
}
return true; // 拖動的時候ListView不滾動
}
//否則直接交給ListView來處理onTouchEvent事件
return super.onTouchEvent(ev);
}
@Override
public void computeScroll() {
// 調用startScroll的時候scroller.computeScrollOffset()返回true,
if (scroller.computeScrollOffset()) {
// 讓ListView item根據當前的滾動偏移量進行滾動
itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
// 滾動動畫結束的時候調用回調介面
if (scroller.isFinished()) {
if (mRemoveListener == null) {
throw new NullPointerException(RemoveListener is null, we should called setRemoveListener());
}
itemView.scrollTo(0, 0);
mRemoveListener.removeItem(removeDirection, slidePosition);
}
}
}
/**
* 添加用戶的速度跟蹤器
*
* @param event
*/
private void addVelocityTracker(MotionEvent event) {
if (velocityTracker == null) {
velocityTracker = VelocityTracker.obtain();
}
velocityTracker.addMovement(event);
}
/**
* 移除用戶速度跟蹤器
*/
private void recycleVelocityTracker() {
if (velocityTracker != null) {
velocityTracker.recycle();
velocityTracker = null;
}
}
/**
* 獲取X方向的滑動速度,大於0向右滑動,反之向左
*
* @return
*/
private int getScrollVelocity() {
velocityTracker.computeCurrentVelocity(1000);
int velocity = (int) velocityTracker.getXVelocity();
return velocity;
}
/**
*
* 當ListView item滑出屏幕,回調這個介面
* 我們需要在回調方法removeItem()中移除該Item,然後刷新ListView
*
* @author xiaanming
*
*/
public interface RemoveListener {
public void removeItem(RemoveDirection direction, int position);
}
}
③ android view動畫實現從邊緣滑出的效果怎麼做
添加layout布局文件,在xml設置動畫屬性即可,上下左右四個方向均可以實現 。animation in / off 例如: 1.slide_in_right <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:ration="100" android:fromXDelta="-100.0%p" android:toXDelta="0.0" /> </set> 2.slide_in_right <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:ration="100" android:fromXDelta="100.0%p" android:toXDelta="0.0" /> </set> 3.slide_out_left <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:ration="100" android:fromXDelta="0.0" android:toXDelta="-100.0%p" /> </set> 4.slide_out_right <set xmlns:android="http://schemas.android.com/apk/res/android" >
④ 請教Android環境下使用POI將PPT轉成圖片的問題
代碼:SlideShow ppt = new SlideShow(is); //獲取PPTPictureData[] pictures = ppt.getPictureData(); //圖片信息(包括底圖) 例如有兩張圖Slide[] slide = ppt.getSlides(); //幻燈片信息 例如有三張幻燈片for (int i = 0; i < slide.length; i++){ //循環讀取每一張幻燈片 Shape[] sh = slide[i].getShapes(); //獲取每一頁元素 for (int j = 0; j < sh.length; j++){ //循環讀取每一頁的每一個元素信息 if (sh[j] instanceof AutoShape){ AutoShape shape = (AutoShape)sh[j]; ... }else if(sh[j] instanceof Picture){ Picture picture = (Picture)sh[j] ... } //發現picture無法讀取到底圖 只能讀取到壓到每一頁的元素} 在這里第一張和第三張PPT有底圖信息 第二張只有文字信息請問: 在pictuerdata 裡面獲取的圖片信息怎麼判斷是屬於哪一頁的
⑤ Android slidemenu 左滑菜單框架怎麼監聽菜單項的點擊事件
package com.qm.test;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.CanvasTransformer;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
import android.graphics.Canvas;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Interpolator;
import android.widget.TextView;
import android.widget.Toast;
/*
* 主頁麵包裝菜單、返回動畫、退出事件的包裝類
*/
public class ListActivityMode extends SlidingFragmentActivity {
private CanvasTransformer mTransformer;
private SlidingMenu sm;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSlidingMenu(this);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
/*
* 當主頁面不可見時關閉菜單
* @see android.support.v4.app.FragmentActivity#onStop()
*/
@Override
protected void onStop() {
// TODO Auto-generated method stub
if(sm.isMenuShowing()){
sm.toggle();
}
super.onStop();
}
private long exitTime = 0;
/*
* 雙擊返回歲或按鈕退出
* @see android.support.v4.app.FragmentActivity#onKeyDown(int, android.view.KeyEvent)
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (KeyEvent.KEYCODE_BACK == keyCode) {
// 判斷是否在兩秒之內連續點擊返回鍵,是則退出,否則不雹物退出
if (System.currentTimeMillis() - exitTime > 2000) {
Toast.makeText(getApplicationContext(), "再按一次退出程乎肆伍序",
Toast.LENGTH_SHORT).show();
// 將系統當前的時間賦值給exitTime
exitTime = System.currentTimeMillis();
} else {
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
/*
* 菜單初始化程序
* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
toggle();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* 初始化滑動菜單
*/
public void initSlidingMenu(SlidingFragmentActivity activity) {
//初始化動畫效果
initAnimation(activity);
// 設置主界面視圖
// activity.setContentView(R.layout.activity_main);
// 設置滑動菜單視圖
activity.setBehindContentView(R.layout.menu_frame);
activity.getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame, new SampleListFragment()).commit();
// 設置滑動菜單的屬性值
sm = activity.getSlidingMenu();
sm.setShadowWidthRes(R.dimen.shadow_width);
sm.setShadowDrawable(R.drawable.shadow);
sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
sm.setFadeDegree(0.35f);
sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
sm.setBehindScrollScale(0.0f);
sm.setBehindCanvasTransformer(mTransformer);
activity.setSlidingActionBarEnabled(true);
}
private Interpolator interp = new Interpolator() {
@Override
public float getInterpolation(float t) {
t -= 1.0f;
return t * t * t + 1.0f;
}
};
/**
* 初始化動畫效果
*/
private void initAnimation(SlidingFragmentActivity activity) {
mTransformer = new CanvasTransformer() {
@Override
public void transformCanvas(Canvas canvas, float percentOpen) {
canvas.translate(0, canvas.getHeight() * (1 - interp.getInterpolation(percentOpen)));
}
};
}
}
⑥ 如何在android中實現swipe的手勢功能及頁面拖動動畫
SimpleOnGestureListener. 你只需要實現自己所關心的手勢就可以了.
Swipe在android裡面是叫Fling ^_^
首先創建自己的一個手勢detector類:
private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200;然後在onFling方法中, 判斷是不是一個合理的swipe動作: if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { viewFlipper.setInAnimation(slideLeftIn); viewFlipper.setOutAnimation(slideLeftOut); viewFlipper.showNext(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { viewFlipper.setInAnimation(slideRightIn); viewFlipper.setOutAnimation(slideRightOut); viewFlipper.showPrevious(); }里的viewFlipper是含有多個view的一個container, 可以很方便的調用prev/next view, 加上animation動畫, 可以達到一些不錯的效果:
viewFlipper = (ViewFlipper)findViewById(R.id.flipper); slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in); slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out); 自定義的animation可以查看具體的XML, 比如從左邊進來的一個動畫:
⑦ Android 滑動菜單(slide menu) 背景 亮度和透明度設置
首先在sdk目錄下source源碼目錄下搜索DrawerLayout文件,把相關的java文件導入工程
以5.0為例
@Override
protectedbooleandrawChild(Canvascanvas,Viewchild,longdrawingTime){
finalintheight=getHeight();
finalbooleandrawingContent=isContentView(child);
intclipLeft=0,clipRight=getWidth();
finalintrestoreCount=canvas.save();
if(drawingContent){
finalintchildCount=getChildCount();
for(inti=0;i<childCount;i++){
finalViewv=getChildAt(i);
if(v==child||v.getVisibility()!=VISIBLE||
!hasOpaqueBackground(v)||!isDrawerView(v)||
v.getHeight()<height){
continue;
}
if((v,Gravity.LEFT)){
finalintvright=v.getRight();
if(vright>clipLeft)clipLeft=vright;
}else{
finalintvleft=v.getLeft();
if(vleft<clipRight)clipRight=vleft;
}
}
canvas.clipRect(clipLeft,0,clipRight,getHeight());
}
finalbooleanresult=super.drawChild(canvas,child,drawingTime);
canvas.restoreToCount(restoreCount);
if(mScrimOpacity>0&&drawingContent){
/*
*這里是直接用畫筆畫了一層有透明度的方塊覆蓋在主內容上方,產生慢*慢變暗的效果,所以我們只需要在這里修改即可,
*根據代碼邏輯可以知道我們只需要改變imag即可
*/
finalintbaseAlpha=(mScrimColor&0xff000000)>>>24;
finalintimag=(int)(baseAlpha*mScrimOpacity);
finalintcolor=imag<<24|(mScrimColor&0xffffff);
mScrimPaint.setColor(color);
canvas.drawRect(clipLeft,0,clipRight,getHeight(),mScrimPaint);
}elseif(mShadowLeft!=null&&(child,Gravity.LEFT)){
finalintshadowWidth=mShadowLeft.getIntrinsicWidth();
finalintchildRight=child.getRight();
finalintdrawerPeekDistance=mLeftDragger.getEdgeSize();
finalfloatalpha=
Math.max(0,Math.min((float)childRight/drawerPeekDistance,1.f));
//這里是繪制菜單的覆蓋物
mShadowLeft.setBounds(childRight,child.getTop(),
childRight+shadowWidth,child.getBottom());
mShadowLeft.setAlpha((int)(0xff*alpha));
mShadowLeft.draw(canvas);
}elseif(mShadowRight!=null&&(child,Gravity.RIGHT)){
finalintshadowWidth=mShadowRight.getIntrinsicWidth();
finalintchildLeft=child.getLeft();
finalintshowing=getWidth()-childLeft;
finalintdrawerPeekDistance=mRightDragger.getEdgeSize();
finalfloatalpha=
Math.max(0,Math.min((float)showing/drawerPeekDistance,1.f));
mShadowRight.setBounds(childLeft-shadowWidth,child.getTop(),
childLeft,child.getBottom());
mShadowRight.setAlpha((int)(0xff*alpha));
mShadowRight.draw(canvas);
}
returnresult;
}
改變代碼之後保存
這時候在布局文件中就不要使用android-supportv4包下的DrawerLayout的,改成你工程里修改後的DrawerLayout,運行就達到效果了
⑧ Android轉場動畫一說
所謂轉場動畫,通俗的講就是一個Activity跳轉到另一個Activity是的動畫。
Activity的轉場動畫很早就有了,5.0之前用的是overridePendingTransition()這個方法。在5.0之後,Google使用Material Design設計風格,進而有了的新的轉場轉場動畫的誕生,效果還是挺炫酷的,下面我們先看下效果。
其實這里主要是靠overridePendingTransition(int enterAnim, int exitAnim)來載入動畫,顧名思義第一個參數是進場動畫,第二個是出場動畫。
這幾個效果是可以交互使用,比如進場用Fade效果,出場用SLide效果。也可以使用自定義的效果,這里不細說。當然5.0後了類似共享元素這類的效果那就另當別論了
說到這里不得不說Google在5.0MD設計中給我提供全新的過度動畫ActivityOptions,以及兼容包ActivityOptionsCompat.下面來說一說它提供幾種過度效果的方法
⑨ 安卓中怎麼實現listview 條目拖動排序
SlideAndDragListView,可排序、可滑動item顯示」菜單」的ListView。
SlideAndDragListView(SDLV)繼承於Android的ListView,SDLV可以拖動item到SDLV的任意位置,其中包括了拖動item往上滑和往下滑;SDLV可以向右滑動item,像Android的QQ那樣(QQ是向左滑),然後顯現出來"菜單」之類的按鈕。