1. 程式人生 > >基於DreamService的屏保

基於DreamService的屏保

public class DayDreamService extends DreamService {

	private final static String TAG = "DayDreamService";
	private ViewPager viewPager;
	private List<ImageView> imageViews;

	private int currentItem = 0;
	private MyAdapter pageAdapter;
	boolean nowAction = false;// 當前使用者正在滑動檢視
	String[] fileName = new String[0];
	AssetManager manager;
	private String[] imageUrls=null;
	private ScheduledExecutorService scheduledExecutorService;
	ImageLoader imageLoader;

	@Override
	public void onAttachedToWindow() {
		super.onAttachedToWindow();
		setInteractive(false);
		setFullscreen(true);
		setContentView(R.layout.mydream);
		configImageLoader();
		init();
	}
	
	//退出的時候幹掉自己哈哈哈哈
	@Override
	public void onDetachedFromWindow(){
		super.onDetachedFromWindow();
		
		viewPager = null;
		manager = null;
		imageLoader = null;
		imageViews = null;
		scheduledExecutorService=null;
		imageUrls=null;
		fileName=null;
		pageAdapter=null;
		
		System.exit(0);
		android.os.Process.killProcess(android.os.Process.myPid());
		Log.d(TAG, "onDetachedFromWindow");
	}

	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			viewPager.setCurrentItem(currentItem);
		};
	};

	//獲取目錄下的圖片的絕對路徑
	@SuppressWarnings("finally")
	public String[] getImageName(Context context, String loc) {
		String prefix = "";
		try {
			
			if (loc.equalsIgnoreCase("screen")) {
				manager = context.getAssets();
				fileName = manager.list(loc);
				prefix = "assets://screen/";
			} else {
				File f = new File(loc);
				fileName = f.list();
				prefix = "file:///data/local/tmp/image/";
			}
		}  catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(fileName!=null){
			for (int i = 0; i < fileName.length; i++) {
				fileName[i] = prefix + fileName[i];
			}
			}
			return fileName;
		}
	}

	@Override
	public void onDreamingStarted() {
		scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
		//20秒換一圖
		scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 20, 20, TimeUnit.SECONDS);
		super.onDreamingStarted();
	}

	private class ScrollTask implements Runnable {

		public void run() {
			synchronized (viewPager) {
				if (!nowAction) {
					System.out.println("currentItem: " + currentItem);
					currentItem = currentItem + 1;
					handler.obtainMessage().sendToTarget();
				}
			}
		}
	}

	private class MyPageChangeListener implements OnPageChangeListener {

		public void onPageSelected(int position) {
			currentItem = position;

		}

		public void onPageScrollStateChanged(int arg0) {
			if (arg0 == 0) {
				nowAction = false;
			}
			if (arg0 == 1) {
				nowAction = true;
			}
			if (arg0 == 2) {
			}
		}

		public void onPageScrolled(int arg0, float arg1, int arg2) {

		}

	}

	public void init() {
		//首先獲取/data/local/tmp/image/目錄下的圖片,如果沒有就獲取screen裡的預設圖片
		imageUrls = getImageName(this, "/data/local/tmp/image/");
		if (imageUrls==null||imageUrls.length==0) {
			imageUrls = getImageName(this, "screen");
		}

		imageViews = new ArrayList<ImageView>();

		for (int i = 0; i < imageUrls.length; i++) {
			// ImageView imageView = new ImageView(this);

			ImageView imageView = (ImageView) LayoutInflater.from(this).inflate(R.layout.view_banner, null);
			ImageLoader.getInstance().displayImage(imageUrls[i], imageView);

			// imageView.setImageResource(imageResId[i]);
			imageView.setScaleType(ScaleType.CENTER_CROP);
			imageViews.add(imageView);
		}

		viewPager = (ViewPager) findViewById(R.id.vp);
		pageAdapter = new MyAdapter();
		viewPager.setCurrentItem(Integer.MAX_VALUE / 4);
		viewPager.setAdapter(pageAdapter);

		// 切換動畫實現淡入淡出效果
		viewPager.setPageTransformer(true, new DepthPageTransformer());

		// 設定滑動切換時間
		try {
			Field mScroller = null;
			mScroller = ViewPager.class.getDeclaredField("mScroller");
			mScroller.setAccessible(true);
			FixedSpeedScroller scroller = new FixedSpeedScroller(viewPager.getContext());
			scroller.setScrollDuration(1500);
			mScroller.set(viewPager, scroller);
		} catch (NoSuchFieldException e) {

		} catch (IllegalArgumentException e) {

		} catch (IllegalAccessException e) {

		}

		viewPager.setOnPageChangeListener(new MyPageChangeListener());

	}

	//ViewPager的Adapter
	private class MyAdapter extends PagerAdapter {

		@Override
		public int getCount() {
			//定義一個極大的數,實現偽無線迴圈
			return Integer.MAX_VALUE / 2;
		}

		@Override
		public Object instantiateItem(View arg0, int position) {
			View view = null;
			if (position % imageViews.size() < 0) {
				view = imageViews.get(imageViews.size() + position);
			} else {
				view = imageViews.get(position % imageViews.size());
			}
			ViewParent vp = view.getParent();
			if (vp != null) {
				ViewGroup parent = (ViewGroup) vp;
				parent.removeView(view);
			}
			((ViewPager) arg0).addView(view);

			return view;
		}

		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}
	}

	//configImageLoader框架,用來管理和處理圖片
	private void configImageLoader() {
		// 初始化ImageLoader
		@SuppressWarnings("deprecation")
		DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.ic_launcher) // 設定圖片下載期間顯示的圖片
				// .showImageForEmptyUri(R.drawable.ic_launcher) //
				// 設定圖片Uri為空或是錯誤的時候顯示的圖片
				.showImageOnFail(R.drawable.icon) // 設定圖片載入或解碼過程中發生錯誤顯示的圖片
				.bitmapConfig(Bitmap.Config.RGB_565) // 圖片太多的時候設定 ,避免記憶體溢位和解碼失敗
				//.cacheInMemory(true) // 設定下載的圖片是否快取在記憶體中
				//.cacheOnDisc(true) // 設定下載的圖片是否快取在SD卡中
				// .displayer(new RoundedBitmapDisplayer(20)) // 設定成圓角圖片
				.build(); // 建立配置過得DisplayImageOption物件

		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
				.defaultDisplayImageOptions(options).threadPriority(Thread.NORM_PRIORITY - 2)
				.denyCacheImageMultipleSizesInMemory().discCacheFileNameGenerator(new Md5FileNameGenerator())
				.tasksProcessingOrder(QueueProcessingType.LIFO).build();
		ImageLoader.getInstance().init(config);
	}

}

其中有幾個工具類
/**
 * 自定義高度的viewpapger
 */
public class BaseViewPager extends ViewPager {
	private boolean scrollable = true;

	public BaseViewPager(Context context) {
		super(context);
	}

	public BaseViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	/**
	 * 設定viewpager是否可以滾動
	 * 
	 * @param enable
	 */
	public void setScrollable(boolean enable) {
		scrollable = enable;
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent event) {
		if (scrollable) {
			return super.onInterceptTouchEvent(event);
		} else {
			return false;
		}
	}
}
/**
 * 自定義的淡入淡出效果
 */
public class DepthPageTransformer implements BaseViewPager.PageTransformer {  

	
	 private static final float MIN_ALPHA = 0.0f;    //最小透明度  
	  
	    @SuppressLint("NewApi")
		public void transformPage(View view, float position) {  
	        int pageWidth = view.getWidth();    //得到view寬  
	  
	        if (position < -1) { // [-Infinity,-1)  
	            // This page is way off-screen to the left. 出了左邊螢幕  
	            view.setAlpha(0);  
	  
	        } else if (position <= 1) { // [-1,1]  
	            if (position < 0) {  
	                //消失的頁面  
	                view.setTranslationX(-pageWidth * position);  //阻止消失頁面的滑動  
	            } else {  
	                //出現的頁面  
	                view.setTranslationX(pageWidth);        //直接設定出現的頁面到底  
	                view.setTranslationX(-pageWidth * position);  //阻止出現頁面的滑動  
	            }  
	            // Fade the page relative to its size.  
	            float alphaFactor = Math.max(MIN_ALPHA, 1 - Math.abs(position));  
	            //透明度改變Log  
	            view.setAlpha(alphaFactor);  
	        } else { // (1,+Infinity]  
	            // This page is way off-screen to the right.    出了右邊螢幕  
	            view.setAlpha(0);  
	        }  
	    }  	  
	
}  

/**
 * 自定義的Scroller
 */

public class FixedSpeedScroller extends Scroller {
	private int mDuration = 1000;

	public void setScrollDuration(int duration){  
        this.mDuration = duration;  
    } 
	
	public FixedSpeedScroller(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public FixedSpeedScroller(Context context, Interpolator interpolator) {
		super(context, interpolator);
	}

	@Override
	public void startScroll(int startX, int startY, int dx, int dy, int duration) {
		// Ignore received duration, use fixed one instead
		super.startScroll(startX, startY, dx, dy, mDuration);
	}

	@Override
	public void startScroll(int startX, int startY, int dx, int dy) {
		// Ignore received duration, use fixed one instead
		super.startScroll(startX, startY, dx, dy, mDuration);
	}

	public void setmDuration(int time) {
		mDuration = time;
	}

	public int getmDuration() {
		return mDuration;
	}

}

相關推薦

基於DreamService

public class DayDreamService extends DreamService { private final static String TAG = "DayDreamService"; private ViewPager viewPager; private List<I

關於前端Retina 幕兼容和基於Retina 幕兼容的雪碧圖技巧

com 兩張 include 很好 做的 log 項目 only alt 由於蘋果電腦的普及,所以Retina 屏幕兼容越來越重要,在普通屏幕上正常的背景,在Retina 屏幕上都會發虛。 首先新建一個scss文件,起名為utils.scss ,在文件中寫入下面代碼: /*

directx截存bmp文件

n) 截屏保存 tde eas har size ron ted dev #include <d3d9.h> #include <D3dx9tex.h> #pragma comment(lib, "D3D9.lib") #pragma

Python-Tkinter-

lambda表達式 port 運動 create 位置 個數 elf 顏色 over - 屏保可以自己啟動,也可以手動啟動 (這裏使用手動啟動)- 一旦移動鼠標後,或者其他的引發事件,則停止- 如果屏保是一個畫布的話,則沒有畫框- 圖像的動作是隨機的,具有隨機性,可能包括顏

python實現計時器

speed hide 晶體管 oca 時間 trace while 初學 else 什麽都不說先上圖吧,Python 初學者實現屏保計時器 原理:利用 Python turtle 庫實現快速畫圖,每隔一秒鐘擦除屏幕,然後獲得電腦實時時間,再次畫圖,呈現動態時間。 關於數字

Win10檢視的儲存位置

  對於喜歡的Win10屏保分為兩種:一種是本機自帶的儲存位置在C:\Windows\Web; 還有一種就是Win10每天下載的則是在 C:\Users\%username%\AppData\Local\Packages\Microsoft.Windows.Cont

閒來無事,做個程式碼雨

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" type="text/css" href="css/ok.

安裝軟體(Linux終端演示 “黑客帝國” 字母雨介面)和Linux修改管理員密碼

1.Linux修改管理員密碼:開啟終端:1. 重啟 reboot  2.進入核心登陸系統點選e3.進入系統救援介面,定位Linux16所在行,找到ro 後刪除,在此位置新增一條命令: rw init=/sysroot/bin/bash 4.點選Ctrl + x進入核心編輯

安裝軟件(Linux終端演示 “黑客帝國” 字母雨界面)和Linux修改管理員密碼

一次 9.png color 系統救援 lan 解壓 下載 lin 風格 1.Linux修改管理員密碼:打開終端:1. 重啟 reboot 2.進入內核登陸系統點擊e3.進入系統救援界面,定位Linux16所在行,找到ro 後刪除,在此位置添加一條命令: rw i

5.1 設定圖片互動後,顯示藍色圖片

Log顯示是 01-21 20:42:56.519 1361 1410 D skia : --- SkImageDecoder::Factory returned null 01-21 20:42:56.519 1361 1410 W System.err:

Java小球動態程式的製作

一、首先建立包ball,然後建立模板類BallModel BallModel類程式碼如下 : package ball; import java.awt.Color; import java.awt.

python tkinter

第一次用python寫的小程式,記錄下。 需求: 屏保可以自己啟動,也可以手動啟動 一旦敲擊鍵盤或者移動滑鼠後,或者其他的引發時間,則停止 如果屏保是一幅畫的話,則沒有畫框 影象的動作是隨機的,具有隨機性,可能包括顏色,大小,多少, 運動方向,變形等 整個世界

9行python程式碼批量修改window圖檔案

前言 最近看到window10開機桌布特別好看,想去儲存下來,查到其原始檔的路徑如下: C:\Users\JackPi\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\As

用python編寫一個程式(背單詞)

大家好,我是一名即將畢業的大學生,第一次在CSDN上發表文章,之前在其他的部落格上也寫過,但是總的來說,這個平臺的資源要多一些(個人覺得),所以有很多不懂的地方希望大家多多指教。 今天我要給大家分享的是一款自己寫的屏保程式,大學嘛大家最頭疼的就是四六級的考試了,上次考試做閱讀的時候,情不

Python實戰:利用Tkinter實現程式

利用Tkinter實現綵球碰撞屏保 一、架構與思路 (1)主函式: main():通過類啟動程式; (2)類: ScreenSaver():用於定義屏保和主畫布,呼叫球建立、運動等函式; RandomBall():定義球的基本屬性、球建立與運動

tkinter 製作

import random import tkinter class RandomBall(): ''' 定義球的類 ''' def __init__(self, canvas, scrnwidth, scrnheight): #canva

c#1(繞著螢幕跑)

運動軌跡 程式碼:四個timer實現: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using

c#2(斜著跑)

窗口裡添加個一個label; 程式碼:一個timer實現 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawin

Centos特效

生成動畫: 1.安裝epel源CENTOS6/7根據系統二選一 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo wget -O /etc/yum.repos.d/epel.repo h

CentOS關閉休眠和模式

轉載: https://blog.csdn.net/zhongbeida_xue/article/details/51613615因為X的螢幕保護,電源管理機制跟gnome不一樣。所以無法使用對gnome的一套工具進行設定。所幸發現了名為xset的小工具xset程式主要對啟動