这就是个列表,添加一个文件夹就是添加一个列表项。然后按照最后创建或修改时间列表倒序排列,就是这样的效果。
2. android 仿预订日历时间选择(如去哪儿,携程
看标题就知道了,一个日历选择,类似于去哪儿,携程,酒店预订功能
调用方法
package com.fly.caldroid;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Intent;import android.content.res.Configuration;import android.os.Bundle;import android.view.View;import com.wz.caldroid.CalendarCellDecorator;import com.wz.caldroid.CalendarPickerView;import java.util.ArrayList;import java.util.Calendar;import java.util.Collections;import java.util.Date;@SuppressLint("SimpleDateFormat")public class CaldroidActivity extends Activity { private CalendarPickerView calendar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.calendar_activity); Bundle myBundle = getIntent().getExtras(); long seleteTime = myBundle.getLong("selete_time"); final Calendar nextYear = Calendar.getInstance(); nextYear.add(Calendar.MONTH, 3); final Calendar lastYear = Calendar.getInstance(); lastYear.add(Calendar.MONTH, 0); calendar = (CalendarPickerView) findViewById(R.id.calendar_view); Calendar today = Calendar.getInstance(); ArrayList<Date> dates = new ArrayList<Date>(); if (seleteTime>0){
Date d1=new Date(seleteTime); dates.add(d1); }else{
dates.add(today.getTime()); } calendar.setDecorators(Collections.<CalendarCellDecorator>emptyList()); calendar.init(lastYear.getTime(), nextYear.getTime()) // .inMode(CalendarPickerView.SelectionMode.MULTIPLE) // .withSelectedDate(dates.get(0)); initButtonListeners(); } private void initButtonListeners() { calendar.setOnDateSelectedListener(new CalendarPickerView.OnDateSelectedListener() { @Override public void onDateSelected(Date date) {
Intent intent = new Intent(); intent.putExtra("SELETE_DATA_TIME", calendar.getSelectedDate().getTime()); setResult(2, intent); finish(); } @Override public void onDateUnselected(Date date) {
}
}); View titlebar_img_back=findViewById(R.id.titlebar_img_back); titlebar_img_back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {
finish(); }
}); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); }
}
layout======
calendar_activity
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:id="@+id/title_content_layout" android:layout_width="match_parent" android:layout_height="47.5dp" android:background="@color/big_red"> <TextView android:id="@+id/titlebar_text_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginLeft="10dp" android:layout_toRightOf="@+id/titlebar_img_back" android:maxEms="8" android:singleLine="true" android:text="选择日历" android:textColor="@color/white" android:textSize="18sp" android:visibility="visible" /> <ImageView android:id="@+id/titlebar_img_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:padding="5dp" android:src="@drawable/back_ic" android:visibility="visible" /> </RelativeLayout> <com.wz.caldroid.CalendarPickerView android:id="@+id/calendar_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingBottom="16dp" android:scrollbarStyle="outsideOverlay" android:clipToPadding="false" android:background="#FFFFFF" /></LinearLayout>
在textview上显示时间
package com.fly.caldroid;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import java.text.SimpleDateFormat;import java.util.Date;public class MainActivity extends AppCompatActivity { private long seleteTime = 0; private TextView time_choice_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); time_choice_view = (TextView) findViewById(R.id.time_choice_view); time_choice_view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {
Intent intent = new Intent(); Bundle bundle = new Bundle(); bundle.putLong("selete_time", seleteTime); intent.putExtras(bundle); intent.setClass(MainActivity.this, CaldroidActivity.class); startActivityForResult(intent, 5); }
}); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 5) { if (resultCode == 2) { seleteTime = data.getLongExtra("SELETE_DATA_TIME", 0); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date d1 = new Date(seleteTime); String t1 = format.format(d1); if (seleteTime > 0) { time_choice_view.setText(t1); } else { return; }
}
} super.onActivityResult(requestCode, resultCode, data); }
}
3. 有没有大神 用Android实现仿照Siri声波曲线
代码实现
波浪其实是由4条贝塞尔曲线组成的,可以在自定义View的onDraw函数中,用Path.quadTo函数画出4条曲线。
Path.quadTo(float x1, float y1, float x2, float y2)
其中,x1,y1为控制点的坐标值,x2,y2为终点的坐标值;当控制点的x1位于起点与终点之间时,将画出正弦曲线,此时y1控制正弦曲线的高度,即效果图中波浪的高度由y1控制。
实现了曲线绘制和高度控制之后,如何让曲线像波浪一样动起来呢?
我的解决方法是在屏幕左边,即x<0的位置,同样绘制4条正弦曲线,并且启动线程让8条曲线都向右移动,当左边4条曲线全部移动到屏幕内后,让这8条曲线复位。如此周期进行。
解析
使用方法
在xml中,
<com.tao.view.SiriView
android:id="@+id/siriView"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_centerInParent="true"/>
在Activity.Java中,
SiriView siriView = (SiriView) findViewById(R.id.siriView);
// 停止波浪曲线
siriView.stop();
// 设置曲线高度,height的取值是0f~1f
siriView.setWaveHeight(0.5f);
// 设置曲线的粗细,width的取值大于0f
siriView.setWaveWidth(5f);
// 设置曲线颜色
siriView.setWaveColor(Color.rgb(39, 188, 136));
// 设置曲线在X轴上的偏移量,默认值为0f
siriView.setWaveOffsetX(0f);
// 设置曲线的数量,默认是4
siriView.setWaveAmount(4);
// 设置曲线的速度,默认是0.1f
siriView.setWaveSpeed(0.1f);
4. Android仿ios条件选择器pickerview
最近怎么老写View,可能写view比较方便,写其它东西还要抽时间整理总结,写View就直接封完写出来就行。
准备国庆放假,无心工作,那就写篇简单实用一点的文章,总不能白白浪费了时间。
有时候ios端会用到条件选择器,好像是那边自带的,而android这边是没有的,但是为了两端统一,没办法,只能我们去迁就他们了(你让一个有自带的去写自定义是基本不可能的事)。
最经典的是我们有选择地址的需求,比如美团这里的:
这个android是原生是没有的,只有能选择日期的。那怎么办?自定义,好像略难,那就用三方的吧。
https://github.com/Bigkoo/Android-PickerView
我找了很多,就觉得这个库是做得比较好,比较完整的,而且也一直有在维护,还是比较推荐,使用起来也比较方便。项目里有很清晰的文档,建议看之前先浏览过文档。
我使用的效果:
我还是顺便把源码也浏览了下。发现这里有3个比较重要的类,这个之后会简单的介绍:
(1)WheelView
(2)条件选择的WheelOptions, 我感觉这个类的封装有点vm的意思
(3)最外层封装的OptionsPickerView
如果只是为了选择地址的话直接用它封装好的就行,但是有时候可能会需要用到其它的布局或需求,那我们就要在它原有的功能上进行扩展,比如说我写的这个时间段的现在,直接用是没有的,需要自己扩展。
而要进行扩展的话,就要先浏览源码看看它内部怎么写的。
可以从调用的地方找到OptionsPickerView类
然后看看OptionsPickerView类内部,你会发现很多方法,但是基本都是builder方法个getset方法,我们可以找到重要的几个方法。
这里做的是为view设置属性。重要的是这里
这里的意思就是把这个View给WheelOptions这个对象,让它来做处理。然后可以看
看布局。
可以看出它里面是写死固定就是3列。其实我不太赞成这样的做法,对于这样的多情况view的封装,我个人还是比较喜欢做动态的。由于这里固定是3列,所以我上图中4列的情况直接使用是实现不了的,所以需要扩展。这里的WheelView就是单列
它这里布局写死了固定3列,那我肯定是没法复用它的这个布局了,所以就只能重写布局。
我只写了LinearLayout,就是要动态去添加WheelView。
原本的OptionsPickerView中
在builder构造时就固定了布局,所以我这不好扩展,不如重写一个OptionsPickerView,当然重写Builder也行,但是我觉得重写OptionsPickerView比较好。而且他原本只有两个类
所以我们需要继承BasePickerView重写一个PickerView,他原本内部的逻辑没问题,我就抄过来用好了。
修改了
(1)修改布局变成我的布局
(2)然后把创建WheelView给加扩展createWheel(optionsPicker, context, total);因为我不想每次都都写Builder这么多参数,我把这个pickerview当成中间成来弄,让子类继承它来做简单的扩展
我们重写个WheelView,因为原本的WheelView是做固定3列的处理,我们需要做成个动态的。
(1)我多添加了个参数total表示要展示多少列
(2)用List<WheelView> wvList数组来动态创建添加WheelView
(3)用List<List<T>> items 来装每一列的数据(我这个Wheel只做了不关联情况下的多列,关联情况下我没弄)
(4)showWheelView();
这个方法做展示的规则,默认是平均展示total列,而如果需要做特殊的展示情况,像我上边一样的,就写个类继承这个类重新这个方法重新展示的规则就行,比如我的时间期间选择器。
重写这个方法就能展示出自己需要展示的效果
调用时也很方便。
我讲这篇的目的是为了第一介绍一下这个三方库,还是比较实用的。第二,说下扩展的重要性。第三,放假了实在工作效率低。
5. android仿QQ右上角显示未读消息个数,求助
监听消息,得到数目,在app图标上画出数字(canvas),然后替换桌面快捷方式
public void createShortCut(){
//创建快捷方式的Intent
Intent shortcutintent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
//不允许重复创建
shortcutintent.putExtra("plicate", false);
//需要现实的名称
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
//快捷图片(每次重绘logo生成一张新图)
Parcelable icon = Intent.ShortcutIconResource.fromContext(activity, R.drawable.logo);
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
//点击快捷图片,运行的程序主入口
shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent());
//发送广播。OK
sendBroadcast(shortcutintent);
}
}