首页 文章 精选 留言 我的

精选列表

搜索[人设自定义],共10006篇文章
优秀的个人博客,低调大师

Android--自定义toolbar(Fragment)

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79260181 public class ContactsFragment extends BaseFragment { /** * 标志位,标志已经初始化完成 */ private boolean isPrepared; /** * 是否已被加载过一次,第二次就不再去请求数据了 */ private boolean mHasLoadedOnce; private TextView textView; private Toolbar toolbar; SimpleToolbar simpleToolbar; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (mView == null) { // 需要inflate一个布局文件 填充Fragment mView = inflater.inflate(R.layout.fragment_contacts, container, false); initView(); isPrepared = true; // 实现懒加载 lazyLoad(); } //缓存的mView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个mView已经有parent的错误。 ViewGroup parent = (ViewGroup) mView.getParent(); if (parent != null) { parent.removeView(mView); } return mView; } /** * 初始化控件 */ private void initView() { simpleToolbar = find(R.id.toolbar_contacts); simpleToolbar.setMainTitle("联系人"); simpleToolbar.setRightTitleClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MyApplication.getContext(),"plus",Toast.LENGTH_SHORT).show(); } }); } @Override public void lazyLoad() { if (!isPrepared || !isVisible || mHasLoadedOnce) { return; } //填充各控件的数据 mHasLoadedOnce = true; } public static ContactsFragment newInstance(String param1) { ContactsFragment fragment = new ContactsFragment(); Bundle args = new Bundle(); args.putString("agrs1", param1); fragment.setArguments(args); return fragment; } } public class SimpleToolbar extends Toolbar { /** * 中间Title */ private TextView mTxtMiddleTitle; /** * 右侧Title */ private TextView mTxtRightTitle; public SimpleToolbar(Context context) { super(context); } public SimpleToolbar(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public SimpleToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { super.onFinishInflate(); mTxtMiddleTitle = (TextView) findViewById(R.id.middle_title); mTxtRightTitle = (TextView) findViewById(R.id.right_title); } //设置中间title的内容 public void setMainTitle(String text) { this.setTitle(" "); mTxtMiddleTitle.setVisibility(View.VISIBLE); mTxtMiddleTitle.setText(text); } //设置中间title的内容文字的颜色 public void setMainTitleColor(int color) { mTxtMiddleTitle.setTextColor(color); } //设置title右边文字 public void setRightTitleText(String text) { mTxtRightTitle.setVisibility(View.VISIBLE); mTxtRightTitle.setText(text); } //设置title右边文字颜色 public void setRightTitleColor(int color) { mTxtRightTitle.setTextColor(color); } //设置title右边图标 public void setRightTitleDrawable(int res) { Drawable dwRight = ContextCompat.getDrawable(getContext(), res); dwRight.setBounds(0, 0, dwRight.getMinimumWidth(), dwRight.getMinimumHeight()); mTxtRightTitle.setCompoundDrawables(null, null, dwRight, null); } //设置title右边点击事件 public void setRightTitleClickListener(OnClickListener onClickListener){ mTxtRightTitle.setOnClickListener(onClickListener); } } <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:app="http://schemas.android.com/apk/res-auto"> <view.SimpleToolbar android:id="@+id/toolbar_contacts" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" > <TextView android:id="@+id/middle_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textSize="20sp" android:textColor="@color/white" /> <TextView android:id="@+id/right_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:layout_marginRight="10dp" android:drawableRight="@drawable/plus" android:gravity="center" android:textColor="#ffffff" android:textSize="16sp" android:visibility="visible" /> </view.SimpleToolbar> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="contacts" /> </LinearLayout>

优秀的个人博客,低调大师

iOS 自定义进度条

1. 创建MTProcessView, 并继承自UIButton MTProcessView.h #import <UIKit/UIKit.h> @interface MTProcessView : UIButton // 进度 @property (nonatomic, assign)float process; @end MTProcessView.m实现 #import "MTProcessView.h" @implementation MTProcessView // 设置进度 - (void)setProcess:(float)process { _process = process; // 设置文字 [self setTitle:[NSString stringWithFormat:@"%0.2f%%", process * 100] forState:UIControlStateNormal]; // 重绘 [self setNeedsDisplay]; } // 使用贝塞尔曲线画圆 - (void)drawRect:(CGRect)rect { // 创建一个贝塞尔曲线 UIBezierPath *path = [UIBezierPath bezierPath]; // 圆心 CGPoint center = CGPointMake(rect.size.width / 2, rect.size.height / 2); // 圆半径 CGFloat radius = MIN(center.x, center.y) - 5; // 开始弧度 CGFloat startAngle = - M_PI_2; // 结束弧度 CGFloat endAngle = 2 * M_PI * self.process + startAngle; // 化弧 [path addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES]; // 设置线宽 path.lineWidth = 5; // 设置笔的风格--圆形 path.lineCapStyle = kCGLineCapRound; // 设置线的颜色 [[UIColor orangeColor] setStroke]; // 绘画 [path stroke]; } @end 2. 使用 1). 在Main.Storyboard中拖入一个UIButton,然后设置Class为自己定义的MTProcessView 图1.png 2). 设置Type为Custom, 并设置Text Color为自己想要的颜色 图2.png 3). 通过连线到ViewController.m中,为其属性_process赋值即可。 self.processView.process = process;

优秀的个人博客,低调大师

Android自定义进度条

Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如 ok,我们开始吧: 一)变换前背景 先来看看progressbar的属性: <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:layout_toRightOf="@+id/progressBarV" android:indeterminate="false" android:padding="2dip" android:progress="50" /> 根据style="?android:attr/progressBarStyleHorizontal",我们找到源码中的style.xml <style name="Widget.ProgressBar.Horizontal"> <item name="android:indeterminateOnly">false</item> <item name="android:progressDrawable">@android:drawable/progress_horizontal</item> <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item> <item name="android:minHeight">20dip</item> <item name="android:maxHeight">20dip</item> </style> 看到 <itemname="android:progressDrawable">@android:drawable/progress_horizontal</item> 木有,继续发掘源码,找到drawable下面的progress_horizontal.xml,这就是我们今天的主角了: <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ff9d9e9d" android:centerColor="#ff5a5d5a" android:centerY="0.75" android:endColor="#ff747674" android:angle="270" /> </shape> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#80ffd300" android:centerColor="#80ffb600" android:centerY="0.75" android:endColor="#a0ffcb00" android:angle="270" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ffffd300" android:centerColor="#ffffb600" android:centerY="0.75" android:endColor="#ffffcb00" android:angle="270" /> </shape> </clip> </item> </layer-list> 看到android:id="@android:id/progress"木有,看到android:id="@android:id/secondaryProgress"木有 把这个文件复制到自己工程下的drawable,就可以随心所欲的修改shape的属性,渐变,圆角等等 那么怎么放一个图片进去呢,ok,新建progress_horizontal1.xml: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/progress" android:drawable="@drawable/progressbar" /> </layer-list> 在android:drawable中指定你处理好的图片 然后回到布局中 <ProgressBar android:id="@+id/progressBar1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/progressBar" android:layout_margin="5dip" android:layout_toRightOf="@+id/progressBarV" android:background="@drawable/progress_bg" android:indeterminate="false" android:indeterminateOnly="false" android:maxHeight="20dip" android:minHeight="20dip" android:padding="2dip" android:progress="50" android:progressDrawable="@drawable/progress_horizontal1" /> android:background="@drawable/progress_bg"指定背景 android:progressDrawable="@drawable/progress_horizontal1"前景使用上面的progress_horizontal1 ok,搞定 注意看,四角还是有圆倒角的,貌似是系统自己加上去的,总之我的图片里面是没有做这个倒角处理的 二)纵向进度条 还是得从源码入手,看回progress_horizontal.xml <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ffffd300" android:centerColor="#ffffb600" android:centerY="0.75" android:endColor="#ffffcb00" android:angle="270" /> </shape> </clip> </item> 为什么shape外面要包一层clip呢,官方文档解释是clipdrawable是可以自我复制的,来看看定义 <?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/drawable_resource" android:clipOrientation=["horizontal" | "vertical"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] /> android:clipOrientation有两个属性,默认为horizontal android:gravity有两个属性,默认为left 那我们试试改成vertical和bottom会有什么效果,新建一个progress_vertical.xml,把源码progress_horizontal.xml的内容复制过来,这里去掉了secondaryProgress,修改了clip,shape的渐变中心centerY改为centerX <item android:id="@android:id/progress"> <clip android:clipOrientation="vertical" android:gravity = "bottom"> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ffffd300" android:centerColor="#ffffb600" android:centerX="0.75" android:endColor="#ffffcb00" android:angle="90" /> </shape> </clip> </item> 布局中android:progressDrawable="@drawable/progress_vertical" ok,搞定,就是这么简单: 三)弧形bar 这个也许算不上是进度条,用的也不多,最多也就仪表盘用用,不然谁会把进度条整成圆弧的呢。好吧这个可不是改改源码就能搞定的,看代码 public class Arcs extends View { private Paint mArcPaint; private Paint mArcBGPaint; private RectF mOval; private float mSweep = 0; private int mSpeedMax = 200; private int mThreshold = 100; private int mIncSpeedValue = 0; private int mCurrentSpeedValue = 0; private float mCenterX; private float mCenterY; private float mSpeedArcWidth; private final float SPEED_VALUE_INC = 2; .......... } 首先是一堆成员变量,两个Paint用来画圆弧一个前景一个背景,一个RectF圆弧就画在上面,然后是一些控制参数比如sweep圆弧扫过的角度,xy坐标等等 mArcPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mArcPaint.setStyle(Paint.Style.STROKE); mArcPaint.setStrokeWidth(mSpeedArcWidth); // mPaint.setStrokeCap(Paint.Cap.ROUND); mArcPaint.setColor(0xff81ccd6); BlurMaskFilter mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.INNER); mArcPaint.setMaskFilter(mBlur); mArcBGPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mArcBGPaint.setStyle(Paint.Style.STROKE); mArcBGPaint.setStrokeWidth(mSpeedArcWidth+8); mArcBGPaint.setColor(0xff171717); BlurMaskFilter mBGBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.INNER); mArcBGPaint.setMaskFilter(mBGBlur); 设置两个画笔,颜色,宽度,样式等等,BlurMaskFilter笔是边缘模糊效果,有几种,可以自己尝试 @Override protected void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); Log.i("onSizeChanged w", w+""); Log.i("onSizeChanged h", h+""); mCenterX = w * 0.5f; // remember the center of the screen mCenterY = h - mSpeedArcWidth; mOval = new RectF(mCenterX - mCenterY, mSpeedArcWidth, mCenterX + mCenterY, mCenterY * 2); } 重写父类View的onSizeChanged,为的是自己根据布局中的大小做居中处理 @Override protected void onDraw(Canvas canvas) { drawSpeed(canvas); calcSpeed(); } private void drawSpeed(Canvas canvas) { canvas.drawArc(mOval, 179, 181, false, mArcBGPaint); mSweep = (float) mIncSpeedValue / mSpeedMax * 180; if (mIncSpeedValue > mThreshold) { mArcPaint.setColor(0xFFFF0000); } else { mArcPaint.setColor(0xFF00B0F0); } canvas.drawArc(mOval, 180, mSweep, false, mArcPaint); } private void calcSpeed() { if (mIncSpeedValue < mCurrentSpeedValue) { mIncSpeedValue += SPEED_VALUE_INC; if (mIncSpeedValue > mCurrentSpeedValue) { mIncSpeedValue = mCurrentSpeedValue; } invalidate(); } else if (mIncSpeedValue > mCurrentSpeedValue) { mIncSpeedValue -= SPEED_VALUE_INC; if (mIncSpeedValue < mCurrentSpeedValue) { mIncSpeedValue = mCurrentSpeedValue; } invalidate(); } } 重写onDraw以便重绘canvas drawSpeed里面 通过计算mSweep = (float) mIncSpeedValue / mSpeedMax * 180; 然后canvas.drawArc(mOval, 180, mSweep, false, mArcPaint); 会根据mSweep的变化,画出相应长度的弧度来 根据与阈值的对比,还可以设定不同的 颜色: if (mIncSpeedValue > mThreshold) { mArcPaint.setColor(0xFFFF0000); } else { mArcPaint.setColor(0xFF00B0F0); } calcSpeed通过一个步进来控制增量或减量,以使弧度自然过渡,减少跳跃 ok,大功告成 本文转自java豆子博客园博客,原文链接:http://www.cnblogs.com/error404/archive/2012/10/19/2731437.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

自定义hive url parse函数

在用hive做nginx日志url 分析的时候,经常需要parse url。 hive中自带的函数parse_url可以实现这个功能,不过它对格式的要求比较严格,不能直接用于nginx log的request字段。 1 2 hive -e "select parse_url('http://facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from dual" facebook.com 1 2 hive -e "select parse_url('facebook.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST') from dual" NULL 也可以通过regexp_extract来实现,不过需要写正则,同时性能也有些问题。。 1 2 hive -e "select regexp_extract('GET /vips-mobile/router.do?api_key=24415b921531551cb2ba756b885ce783&app_version=1.8.6&fields=sku_id HTTP/1.1','.+? +(.+?)app_version=(.+?)&(.+) .+?',2) from dual" 1.8.6 考虑自己写一个,借鉴parse_url的udf: 代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 package com.hive.myudf; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.hadoop.hive.ql.exec.UDF; public class UDFNginxParseUrl extends UDF { private String schemal = "http://" ; private String host1 = null ; private Pattern p1 = null ; private URL url = null ; private Pattern p = null ; private String lastKey = null ; public UDFNginxParseUrl() { } public String evaluate(String host1, String urlStr, String partToExtract) { if (host1 == null || urlStr == null || partToExtract == null ) { return null ; } p1 = Pattern.compile( "(.+?) +(.+?) (.+)" ); Matcher m1 = p1.matcher(urlStr); if (m1.matches()){ String realUrl = schemal + host1 + m1.group( 2 ); System.out.println( "URL is " + realUrl); try { url = new URL(realUrl); } catch (Exception e){ return null ; } } /* if (lastUrlStr == null || !urlStr.equals(lastUrlStr)) { try { url = new URL(urlStr); } catch (Exception e) { return null; } } lastUrlStr = urlStr; */ if (partToExtract.equals( "HOST" )) { return url.getHost(); } if (partToExtract.equals( "PATH" )) { return url.getPath(); } if (partToExtract.equals( "QUERY" )) { return url.getQuery(); } if (partToExtract.equals( "REF" )) { return url.getRef(); } if (partToExtract.equals( "PROTOCOL" )) { return url.getProtocol(); } if (partToExtract.equals( "FILE" )) { return url.getFile(); } if (partToExtract.equals( "AUTHORITY" )) { return url.getAuthority(); } if (partToExtract.equals( "USERINFO" )) { return url.getUserInfo(); } return null ; } public String evaluate(String host, String urlStr, String partToExtract, String key) { if (!partToExtract.equals( "QUERY" )) { return null ; } String query = this .evaluate(host, urlStr, partToExtract); if (query == null ) { return null ; } if (!key.equals(lastKey)) { p = Pattern.compile( "(&|^)" + key + "=([^&]*)" ); } lastKey = key; Matcher m = p.matcher(query); if (m.find()) { return m.group( 2 ); } return null ; } } add jar和create function之后测试: 1 2 hive -e "select nginx_url_parse('test.test.com','GET /vips-mobile/router.do?api_key=24415&app_version=1.8.6&fields=sku_id HTTP/1.1','HOST') FROM dual;" test.test.com 1 2 hive -e "select nginx_url_parse('test.test.com','GET /vips-mobile/router.do?api_key=24415&app_version=1.8.6&fields=sku_id HTTP/1.1','QUERY','api_key') FROM dual;" 24415 这样就可以直接应用于nginx的日志了。 本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1350463,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册