立刻就要520和521了,是否是還有像我同樣的單身狗啊。我就知道有,因此這兩天簡單寫了這個小程序(實際上是替別人寫的),雖然我並不會用去騙女孩子(由於最近太忙了,實習完以後要搞畢設,要搞論文啊,誰能幫幫我...),可是我想不少人確定會感興趣吧。若是你感興趣就拿去逗妹子一樂吧。html
若是你很感興趣,你能夠在我寫的基礎上增輝加彩,或者根據我提供的資源本身動手,嘗試一下。java
https://www.aswifter.com/2015/07/10/android-record-video-to-gif/android
第一次試的時候沒有成功,第二次設定屏幕分辨率後成功了,可是效果太差。果斷又試了第三次,成功了,手機根目錄出現了剛剛錄製的視屏文件。git
adb pull 會把文件從手機上覆制到本地(ANDROID_SDK_HOME/platform-tools目錄下,也就是adb.exe所在的目錄)github
接着就是轉換成gif了,這裏我用PS處理web
而後文件——》存儲爲web全部格式——》選擇gif。若是gif過大,可能會致使ps崩潰,簡單的作法就是調整圖片的大小,就能夠了。小程序
apk文件:https://github.com/hjzgg/LoveDemo/tree/master/binswift
項目:https://github.com/hjzgg/LoveDemo網絡
大二的時候搞過一段時間的android,時隔一年半,好多東西都忘了,不過如今撿起來也不晚。app
開發工具使用eclipse或者android studio。我使用的eclipse,那麼就要本身去安裝ADT和SDK了,安裝的時間有點蛋疼啊。
做爲一個表白程序,必需要有圖片吧,文字吧, 最好加上背景音樂吧,否則就真的沒有意思了。下面分享幾個資源連接:
文字特效: https://github.com/elevenetc/TextSurface
圖片切花特效: https://github.com/daimajia/AndroidImageSlider
音樂播放器: http://www.cnblogs.com/TerryBlog/archive/2010/06/26/1765910.html
先說一下文字特效,將文字特效的代碼下載下來後,全部的演示代碼放在了\app\src\main\java\su\levenetc\android\textsurface\sample\checks這裏面,app\src\main\java\su\levenetc\android\textsurface\sample\SampleActivity.java是app入口activity。最主要的代碼放在了library目錄下,須要將library\src\main下面的文件複製到咱們的項目中,參考入口activity的內容進行調用就能夠了。 資源中提供了不少文字展現的效果,本人愚鈍,只用了兩個,並且用的不是太好。我主要增長了文字處理,效果結合的功能。將要展現的文字按照4句劃分,而後調用文字效果展現。文字資源放在了assets文件夾下面。
圖片切換特效很好用,進本不要改動,直接把圖片換了就好了,效果不錯。
音樂播放器引用網上的一位哥們兒的,寫的簡介靠譜,這裏直接拿來用了,用的是MediaPlayer進行音樂播放。我改了一些地方,裏面有點兒小bug。增長了一個功能,就是在sd卡不存在的時候(不管是內置的仍是外置的),依然能夠獲取到音樂文件,考慮了好多方式,好比直接調用網上的,或者調用手機內存中的...,想了想仍是將音樂文件放在項目當中了,能夠放在res/raw下,也能夠放在assets下,各有好處,本人放在了res/raw目錄下。還有一個要注意的是判斷手機的sd卡環境是否可使用。具體的仍是看代碼吧。
說了這麼多,最主要的代碼都是在一個activity中,代碼以下:
public class MainActivity extends ListActivity implements BaseSliderView.OnSliderClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化圖片切換 initChangePicture(); //初始化音樂 initMusic(); //初始化文字展現 initWord(); } @Override public void onSliderClick(BaseSliderView slider) { Toast.makeText(this, slider.getBundle().get("extra") + "",Toast.LENGTH_SHORT).show(); } private SliderLayout mDemoSlider; private void initChangePicture(){ mDemoSlider = (SliderLayout)findViewById(R.id.slider); //兩種方式加載數據 //加載本地 HashMap<String,String> url_maps = new HashMap<String, String>(); url_maps.put("GitOnWay", "http://gitonway.blog.163.com/"); //加載網絡 HashMap<String,Integer> file_maps = new HashMap<String, Integer>(); file_maps.put("love-A",R.drawable.a); file_maps.put("love-B",R.drawable.b); file_maps.put("love-C",R.drawable.c); file_maps.put("love-D", R.drawable.d); for(String name : file_maps.keySet()){ TextSliderView textSliderView = new TextSliderView(this); // 初始化幻燈片頁面 textSliderView .description(name) .image(file_maps.get(name)) .setOnSliderClickListener(this); //添加要傳遞的數據 textSliderView.getBundle() .putString("extra",name); mDemoSlider.addSlider(textSliderView); } // 幻燈片切換方式 mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Accordion); // 指示符位置 mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom); // 定義指示器樣式 // mDemoSlider.setCustomIndicator(your view); // 幻燈片循環 // mDemoSlider.startAutoCycle(); // 中止循環 mDemoSlider.stopAutoCycle(); // 設置指示器的顯示與否 mDemoSlider.setIndicatorVisibility(PagerIndicator.IndicatorVisibility.Visible); // 設置幻燈片的轉化時間 // mDemoSlider.setSliderTransformDuration(5000, null); // 用來自定義幻燈片標題的顯示方式 mDemoSlider.setCustomAnimation(new DescriptionAnimation()); // 幻燈片切換時間 mDemoSlider.setDuration(3000); // 實現隨機切換 TimerTask task = new TimerTask() { @Override public void run() { Transformer[] tranformers = SliderLayout.Transformer.values(); Transformer transformer = tranformers[(int) (Math.random() * tranformers.length)]; mDemoSlider.setPresetTransformer(transformer); } }; new Timer().schedule(task, 2000, 2000); } //res/raw中的音樂文件資源映射 private Map<String, Integer> musicPath; //播放對象 private MediaPlayer myMediaPlayer; //播放列表 private List<String> myMusicList = new ArrayList<String>(); //當前播放歌曲的索引 private int currentListItem=0; //音樂的路徑, 若是存在sd卡,則使用sd卡,不然使用內存中的data目錄 private static String MUSIC_PATH = hasSDCardMounted() ? new String(Environment.getExternalStorageDirectory().getAbsolutePath() + "/hjz/") : null; private void initMusic(){ myMediaPlayer=new MediaPlayer(); findView(); musicList(); listener(); //自動播放第一首歌 if(myMusicList.size() > 0){ playMusic(MUSIC_PATH, myMusicList.get(currentListItem)); } } public static boolean hasSDCardMounted() { String state = Environment.getExternalStorageState(); if (state != null && state.equals(Environment.MEDIA_MOUNTED)) { return true; } else { return false; } } //綁定音樂 private void musicList(){ try { File home = new File(MUSIC_PATH); //若是有sd卡,可是sd卡中沒有指定的音樂文件夾,則採用項目中的音樂文件 if(MUSIC_PATH == null || home.listFiles() == null) {//綁定 res/raw下的音樂文件 MUSIC_PATH = null; musicPath = new HashMap<String, Integer>(); musicPath.put("楊宗緯 - 一次就好.mp3", R.raw.yi_ci_jiu_hao); musicPath.put("霍建華,趙麗穎 - 不可說.mp3", R.raw.bu_ke_shuo); musicPath.put("川井憲次 - 孤獨な巡禮.mp3", R.raw.gu_du_xun_li); myMusicList.addAll(musicPath.keySet()); } else { Log.v("MUSIC_PATH", MUSIC_PATH); if(home.listFiles(new MusicFilter()).length>0){ for(File file:home.listFiles(new MusicFilter())){ myMusicList.add(file.getName()); } } } if(myMusicList.size() > 0) { ArrayAdapter<String> musicList = new ArrayAdapter<String>(MainActivity.this, R.layout.musicitme, myMusicList); setListAdapter(musicList); } } catch (Exception e) { Log.e("獲取音樂文件出錯:", e.toString()); } } //獲取按鈕 void findView(){ viewHolder.start=(Button)findViewById(R.id.start); viewHolder.stop=(Button)findViewById(R.id.stop); viewHolder.next=(Button)findViewById(R.id.next); viewHolder.pause=(Button)findViewById(R.id.pause); viewHolder.last=(Button)findViewById(R.id.last); } //監聽事件 void listener(){ //中止 viewHolder.stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(myMediaPlayer.isPlaying()){ myMediaPlayer.reset(); } } }); //開始 viewHolder.start.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(myMusicList.size() == 0) return; playMusic(MUSIC_PATH, myMusicList.get(currentListItem)); } }); //下一首 viewHolder.next.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { nextMusic(); } }); //暫停 viewHolder.pause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(myMusicList.size() == 0) return; if(myMediaPlayer.isPlaying()){ myMediaPlayer.pause(); }else{ myMediaPlayer.start(); } } }); //上一首 viewHolder.last.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { lastMusic(); } }); } //播放音樂 void playMusic(String basePath, String path){ try { if(basePath != null) { myMediaPlayer.reset(); myMediaPlayer.setDataSource(basePath+path); myMediaPlayer.prepare(); } else { myMediaPlayer.pause(); myMediaPlayer.release(); myMediaPlayer = MediaPlayer.create(MainActivity.this, musicPath.get(path)); } myMediaPlayer.start(); myMediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { nextMusic(); } }); } catch (Exception e) { Log.e("播放sd卡音樂失敗", e.toString()); e.printStackTrace(); } } //下一首 void nextMusic(){ if(myMusicList.size() > 0) { if(++currentListItem>=myMusicList.size()){ currentListItem=0; } playMusic(MUSIC_PATH, myMusicList.get(currentListItem)); } } //上一首 void lastMusic(){ if(myMusicList.size() > 0) { if(currentListItem!=0) { playMusic(MUSIC_PATH, myMusicList.get(--currentListItem)); } else{ playMusic(MUSIC_PATH, myMusicList.get(currentListItem=myMusicList.size()-1)); } } } //當用戶返回時結束音樂並釋放音樂對象 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ myMediaPlayer.stop(); myMediaPlayer.release(); this.finish(); return true; } return super.onKeyDown(keyCode, event); } //當選擇列表項時播放音樂 @Override protected void onListItemClick(ListView l, View v, int position, long id) { currentListItem=position; playMusic(MUSIC_PATH, myMusicList.get(currentListItem)); } //初始化文字展現 private TextSurface textSurface; private void initWord(){ LinearLayout layout = (LinearLayout) findViewById(R.id.LinearLayoutWord);//找到你要設透明背景的layout 的id layout.getBackground().setAlpha(60);//0~255透明度值 textSurface = (TextSurface) findViewById(R.id.text_surface); textSurface.postDelayed(new Runnable() { @Override public void run() { show(); } }, 1000); } private void show() { textSurface.reset(); List<AnimationsSet> animationsSets = new ArrayList<AnimationsSet>(); animationsSets.add(CookieThumperSample.getCookieThumperAnimations(getAssets())); animationsSets.addAll(SlideSample.getSlideAnimations(getContents())); textSurface.play(TYPE.SEQUENTIAL, animationsSets.toArray(new AnimationsSet[]{})); // ColorSample.play(textSurface); // AlignSample.play(textSurface); // Rotation3DSample.play(textSurface); // ScaleTextSample.run(textSurface); // ShapeRevealLoopSample.play(textSurface); // ShapeRevealSample.play(textSurface); // SlideSample.play(textSurface); // SurfaceScaleSample.play(textSurface); // SurfaceTransSample.play(textSurface); } private List<String> getContents(){ List<String> contents = new ArrayList<String>(); try{ //獲得資源中的asset數據流 String fileName = "content.txt"; //文件名字 String res=""; InputStream in = getResources().getAssets().open(fileName); int length = in.available(); byte [] buffer = new byte[length]; in.read(buffer); in.close(); res = EncodingUtils.getString(buffer, "UTF-8"); String[] strings = res.split("[,|,|\\.|。]"); int len = strings.length/4 * 4; for(int i=0; i < len; ++i) contents.add(strings[i]); }catch(Exception e){ e.printStackTrace(); Log.e("getContents", e.toString()); } return contents; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.gitonway.androidimagesliderdemo.activity.MainActivity"> <LinearLayout android:id="@+id/LinearLayoutPicture" android:orientation="vertical" android:layout_weight="3" android:layout_height="fill_parent" android:layout_width="match_parent"> <!-- 圖片切換 --> <com.gitonway.androidimagesliderdemo.widget.imageslider.SliderLayout android:id="@+id/slider" android:layout_width="match_parent" android:layout_height="fill_parent" custom:pager_animation="Accordion" custom:auto_cycle="true" custom:indicator_visibility="visible" custom:pager_animation_span="1100"/> <!-- <com.gitonway.androidimagesliderdemo.widget.imageslider.Indicators.PagerIndicator android:id="@+id/custom_indicator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" custom:selected_color="#0095BF" custom:unselected_color="#55333333" custom:selected_drawable="@drawable/ic_launcher" custom:shape="oval" custom:selected_padding_left="6dp" custom:selected_padding_right="6dp" custom:unselected_padding_left="2dp" custom:unselected_padding_right="2dp" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" custom:selected_width="6dp" custom:selected_height="6dp" custom:unselected_width="6dp" custom:unselected_height="6dp" android:layout_marginBottom="20dp" /> <com.gitonway.androidimagesliderdemo.widget.imageslider.Indicators.PagerIndicator android:id="@+id/custom_indicator2" style="@style/AndroidImageSlider_Corner_Oval_Orange" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:layout_marginBottom="20dp" /> --> </LinearLayout> <!-- 文字展示 --> <LinearLayout android:id="@+id/LinearLayoutWord" android:layout_weight="3" android:layout_height="fill_parent" android:orientation="vertical" android:background="@android:color/background_dark" android:layout_width="match_parent"> <com.textsurface.TextSurface android:id="@+id/text_surface" android:layout_height="fill_parent" android:layout_width="match_parent"/> </LinearLayout> <!-- 音樂播放器 --> <LinearLayout android:id="@+id/LinearLayoutMusic" android:layout_width="match_parent" android:layout_weight="4" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@id/android:list" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="fill_parent" android:scrollbars="vertical" /> <LinearLayout android:id="@+id/bottomBtn" android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center|center_horizontal|center_vertical" android:orientation="horizontal" > <Button android:id="@+id/last" android:background="@drawable/last" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/stop" android:background="@drawable/stop" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/start" android:background="@drawable/start" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:id="@+id/pause" android:layout_width="wrap_content" android:background="@drawable/pause" android:layout_marginLeft="10dp" android:layout_height="wrap_content"></Button> <Button android:id="@+id/next" android:background="@drawable/next" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> </LinearLayout> </LinearLayout>