android表白app

1、前言

  立刻就要520和521了,是否是還有像我同樣的單身狗啊。我就知道有,因此這兩天簡單寫了這個小程序(實際上是替別人寫的),雖然我並不會用去騙女孩子(由於最近太忙了,實習完以後要搞畢設,要搞論文啊,誰能幫幫我...),可是我想不少人確定會感興趣吧。若是你感興趣就拿去逗妹子一樂吧。html

  若是你很感興趣,你能夠在我寫的基礎上增輝加彩,或者根據我提供的資源本身動手,嘗試一下。java

2、先show一下效果

   

 

3、Android手機如何錄製屏幕及轉GIF

  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崩潰,簡單的作法就是調整圖片的大小,就能夠了。小程序

4、下載地址

  apk文件:https://github.com/hjzgg/LoveDemo/tree/master/binswift

  項目:https://github.com/hjzgg/LoveDemo網絡

5、技術路線,分享個人製做過程

1.準備

  大二的時候搞過一段時間的android,時隔一年半,好多東西都忘了,不過如今撿起來也不晚。app

  開發工具使用eclipse或者android studio。我使用的eclipse,那麼就要本身去安裝ADT和SDK了,安裝的時間有點蛋疼啊。

2.資源收集

  做爲一個表白程序,必需要有圖片吧,文字吧, 最好加上背景音樂吧,否則就真的沒有意思了。下面分享幾個資源連接:

  文字特效: 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卡環境是否可使用。具體的仍是看代碼吧。

3.主要代碼

  說了這麼多,最主要的代碼都是在一個activity中,代碼以下:

  MainActivity.java

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;
    }
}

  activity_main.xml(頁面佈局)

<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>
相關文章
相關標籤/搜索