首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Oracle开发常用函数与存储过程

1.输出用"、"符合分隔多个作者列表 Fuc_Get_AuthorName 2.获取数据库表的主键最大值 Fuc_Get_MaxId 3.根据分割类来分割字符串 sf_split_string 4.计算周岁的函数 Fuc_Get_FullAge 5.获取数据表架构信息 SQL 6.带排序的oracle分页存储过程(来自网络) Code 本文转自peterzb博客园博客,原文链接:http://www.cnblogs.com/peterzb/archive/2009/06/09/1500031.html,如需转载请自行联系原作者。

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

【iOS 开发】延迟执行方法小总结

当需要实现类似“轮询”这种操作的时候,我们可能会希望有一个“被放缓了的” for 循环 —— 即当某次操作执行后,稍等一下再去执行下一次操作。这时有几种方法可以供我们使用,来实现这种效果,下面对比总结一下。 perform(_ aSelector: Selector, with anArgument: Any?, afterDelay delay: TimeInterval) extension NSObject { open func perform(_ aSelector: Selector, with anArgument: Any?, afterDelay delay: TimeInterval, inModes modes: [RunLoopMode]) open func perform(_ aSelector: Selector, with anArgument: Any?, afterDelay delay: TimeInterval) open class func cancelPreviousPerformRequests(withTarget aTarget: Any, selector aSelector: Selector, object anArgument: Any?) open class func cancelPreviousPerformRequests(withTarget aTarget: Any) } extension RunLoop { open func perform(_ aSelector: Selector, target: Any, argument arg: Any?, order: Int, modes: [RunLoopMode]) open func cancelPerform(_ aSelector: Selector, target: Any, argument arg: Any?) open func cancelPerformSelectors(withTarget target: Any) } 这是系统提供的 API,其中最简单的第 2 个方法可以通过指定方法、参数、延迟时间来实现延迟调用。 优点:使用简单、自带根据 target 取消调用的机制 并且可以指定对象、方法来取消延迟调用 使得这个方法可以完成一些复杂的延迟调用机制缺点:系统帮你自动完成了很多操作,使得它不像定时器(NSTimer)那样高度可控。 scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer open class Timer : NSObject { public /*not inherited*/ init(timeInterval ti: TimeInterval, invocation: NSInvocation, repeats yesOrNo: Bool) open class func scheduledTimer(timeInterval ti: TimeInterval, invocation: NSInvocation, repeats yesOrNo: Bool) -> Timer public /*not inherited*/ init(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) open class func scheduledTimer(timeInterval ti: TimeInterval, target aTarget: Any, selector aSelector: Selector, userInfo: Any?, repeats yesOrNo: Bool) -> Timer } 通过常见的定时器也可以实现延迟调用,把 repeats 参数置为 false,可以实现类似上面的 perform 的效果。 优点:定时器状态可控,可以重新赋值,可以查看是否 valid 等缺点:对比上面的 perform 方法可以直接传参,这里想要传参的话只能曲线救国: 把参数放在 timer 的 userInfo 里面,再把 timer 本身当成参数传递(这里使得代码可读性稍稍变差,但是好在 userInfo 里面什么都能放,这使得我们可以同时传递多个参数了) 如果你的代码可以不兼容 iOS 10 以下的系统,新的 API 可以让你不通过 selector 而是通过 block (closure) 执行代码 asyncAfter(deadline: DispatchTime, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping @convention(block) () -> Swift.Void) DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 1, execute: { print("1 second after") }) 上面这段代码,可以在 1 秒之后,通过主线程执行 print。值得注意的是,设定时间的时候,有两种类型,一种是 DispatchTime,这个时间本质上是相对时间,它会在系统休眠的时候暂停,另外一种是 DispatchWallTime,这个时间正如其名,是“墙上的挂钟时间”,是绝对时间,比如你可能希望某一个任务准确地在x小时、x分钟、x秒之后执行,这段时间可能发生任何事情,这时推荐使用 DispatchWallTime. 神奇而伟大的 GCD 这里就不多做介绍了,有太多文章讲解它了优点:执行的是闭包,可以随意传参缺点:一旦开启,无法取消,只能提前在闭包里面添加严谨的逻辑判断了

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

Android应用开发—RecyclerView绘制蒙层

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77718470 背景:如何在跨越两个或两个以上的item绘制一个view,该view需要跟随recyclerView的滑动而整体移动。 @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); final View child = parent.getChildAt(1); if (child != null) { final int left = child.getLeft(); final int right = child.getRight(); final int top = child.getTop(); final int bottom = child.getBottom(); int rightV = (right - left) / 6; int leftV = (right - rightV) - VAUtils.dip2px(mContext, 225); int topV = bottom - VAUtils.dip2px(mContext, 16); int bottomV = topV + VAUtils.dip2px(mContext, 82); ViewGroup.MarginLayoutParams margin = new ViewGroup.MarginLayoutParams(mImageView.getLayoutParams()); margin.setMargins(leftV, topV, rightV, bottomV); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin); mImageView.setLayoutParams(layoutParams); if (!imageClicked) { mImageView.setVisibility(View.VISIBLE); } //画笔 final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //圆心 x 坐标 final float x = parent.getWidth() / 2 + left; ////圆心 y 坐标 final float y = 100 + top; //半径 final float radius = 100; //渐变着色器 坐标随意设置的 final LinearGradient shader = new LinearGradient(x-50, 0, x+100, 200, Color.RED, Color.YELLOW, Shader.TileMode.REPEAT); paint.setShader(shader); //绘制圆 c.drawCircle(x, y, radius, paint); } } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); //画笔 final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //圆心 x 坐标 final float x = parent.getWidth() / 2; ////圆心 y 坐标 final float y = 100; //半径 final float radius = 100; //渐变着色器 坐标随意设置的 final LinearGradient shader = new LinearGradient(x-50, 0, x+100, 200, Color.RED, Color.YELLOW, Shader.TileMode.REPEAT); paint.setShader(shader); //绘制圆 c.drawCircle(x, y, radius, paint); }

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

Android开发六 电话拔号器

效果图: 因为应用要使用手机的电话服务,所以要在清单文件AndroidManifest.xml中添加电话服务权限: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.action" android:versionCode="1" android:versionName="1.0"> 略.... <uses-sdk android:minSdkVersion=“8" /> <uses-permission android:name="android.permission.CALL_PHONE"/> </manifest> 界面布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/inputmobile"/> <EditTextandroid:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/mobile"/> <Buttonandroid:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button" android:id="@+id/button"/> </LinearLayout> LinearLayout (线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局) Activity: public class DialerAction extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { EditText editText = (EditText)findViewById(R.id.mobile); Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ editText.getText())); DialerAction.this.startActivity(intent); } }); } }测试步骤: 1>在Eclipse中运行此应用 2>在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令再开启一个Android模拟器: emulator -data itcast 注:itcast为用户数据存取文件,如果该文件不存在,默认在tools目录创建该文件 3>在电话扰号器中输入上图现显的电话号码 本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2012/04/01/2428995.html,如需转载请自行联系原作者

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

Android应用开发—TextView的动态创建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77131800 动态创建TextView的两种方式: 下面介绍两种创建方式: 在drawable里面创建共同依赖的background.xml文件,里面设置shape来设置文本框的一些特殊效果: eg: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 实心 --> <solid android:color="@android:color/white" /> <!-- 边框 --> <stroke android:width="0.5dp" android:color="@android:color/black" /> <!-- 圆角 --> <corners android:radius="3dp" /> <!-- 边距 --> <padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" /> <!-- 渐变 --> <gradient android:angle="270" android:endColor="#FFFF782" android:startColor="#13C7AF" /> </shape> 代码方式: TextView textView = new TextView(context); textView.setId(id); textView.setText("android"); textView.setTextColor(0xff999faa); textView.setTextSize(12); textView.setBackgroundResource(R.drawable.background); xml配置文件和代码结合方式: textview_layout.xml <?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"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#999faa" android:textSize="12sp" android:background="@drawable/background" android:text="android" /> </LinearLayout> ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.textiew, null); TextView textView = (TextView) findViewById(R.id.textView); viewGroup.removeView(textView); //替换掉textId textView.setId(id); 这样通过前面的两种方式即可创建一个TextView控件,通过xxxViewGroup.addView(textView)即可将改textView加入到xxxViewGroup中。 TextView控件布局位置的控制: 上面创建了textView控件,但该控件的布局位置并没有确定,而这个布局位置又是十分重要的,否则该控件也没有存在的意义。 //此处以RelativeLayout布局为例,同样LinearLayout也支持该接口 //设置RelativeLayout布局的宽高 RelativeLayout.LayoutParams reLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); //以下rules说明设置控件在xxxView的右侧,父控件的底部 reLayoutParams.addRule(RelativeLayout.RIGHT_OF, xxxViewId); reLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); //setMargins设置控件相对其他控件的间隔 reLayoutParams.setMargins(left, top, right, bottom); 以上代码只完成了RelativeLayout的布局rules的设置,如何和待控制的控件绑定呢? xxxViewGroup.addView(textView,reLayoutParams); 为TextView添加边框 在文章开始部分创建了一个background.xml文件,但并没有说明该xml文件的作用,不过也容易猜到,这个background.xml为textView设置了一个边框。 默认情况下TextView控件是没有边框的,如何创建边框,有以下方式: 设置background为透明图片的背景图。 通过shape设置背景图片。(推荐,background.xml即为这个shape配置文件,对该文件各项参数的设置,请参考google) 对前面代码中几处关键点的说明: View.setId(int id)如何避免id冲突: 按照规则,每个View都必须有一个唯一的标识符,这个标识符是一个正整数。而我们上面代码中动态创建的View要如何保证id的唯一性? 在sdk17 以上使用myView.setId(View.generateViewId());在低于17 的版本中我们需要自己去实现一些方法,参考View.Java的内部实现: private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); /** * Generate a value suitable for use in {@link #setId(int)}. * This value will not collide with ID values generated at build time by aapt for R.id. * * @return a generated ID value */ public static int generateViewId() { for (;;) { final int result = sNextGeneratedId.get(); // aapt-generated IDs have the high byte nonzero; clamp to the range under that. int newValue = result + 1; if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. if (sNextGeneratedId.compareAndSet(result, newValue)) { return result; } } } ID大于0x00FFFFFF的已经在xml中定义到了,容易发生冲突。 在调用的地方可以这样使用: if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { myView.setId(Utils.generateViewId()); } else { myView.setId(View.generateViewId()); } } 为什么要调用viewGroup.removeView(textView)? 一个View只能依赖于一个父ViewGroup,我们通过inflate这种方式创建的view已经属于一个ViewGroup了,所以此处需要父ViewGroup先remove掉,否则会报这样的错误:”The specified child already has a parent. You must call removeView” 关于异常“The specified child already has a parent. You must call removeView”的解决 扩展内容—动态添加布局 前面讲到动态添加控件,而布局同样可以动态添加: 方法和上面类似,主要注重如何控制添加的布局的位置,在控制布局的位置的时候使用LayoutParam类来实现。 RelativeLayout rl = new RelativeLayout(this); //设置RelativeLayout布局的宽高 RelativeLayout.LayoutParams relLayoutParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); xxxViewGroup.addView(rl, relLayoutParams); 控件属性相关的一些动态设置的接口: // 设置背景图 textView.setBackgroundResource(R.drawable.block_text_backgroumg); // 设置背景透明度 textView.getBackground().setAlpha(150); // 设定text内容为Html格式 textView.setText(Html.fromHtml(rsultText)); // 设定为可以scroll的textView textView.setMovementMethod(ScrollingMovementMethod.getInstance()); // 设定text内容与边框的距离 textView.setPadding(6, 6, 6, 6); 参考资料: Android 利用addView 动态给Activity添加View组件 android 中使用View.setId(int id),如何避免id冲突呢?

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

iOS开发-UITableView顶部图片下拉放大

关于顶部图片下拉放大,在用户展示的个人中心显示用户个人头像信息,设置UITableView的headerView实现,UITableView继承自UIScrollView,同样的设置UIScrollView的顶部图片也可以实现同样的效果,简单看一下实现的效果: 控制器中设置需要的属性变量: 1 2 3 4 @property (strong,nonatomic) UITableView *tableView; @property (strong,nonatomic) NSArray *data; @property (strong,nonatomic) UIView *tableHeaderView; @property (strong,nonatomic) UIImageView *imageView; 初始化属性: 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 -(UITableView *)tableView{ if (!_tableView) { _tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0,SCREENWIDTH, SCREENHEIGHT)]; _tableView. delegate =self; _tableView.dataSource=self; _tableView.showsVerticalScrollIndicator=NO; _tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; [_tableView registerClass:[UITableViewCell class ] forCellReuseIdentifier:CellIdetifier]; } return _tableView; } -(UIView *)tableHeaderView{ if (!_tableHeaderView) { _tableHeaderView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0,SCREENWIDTH, 100)]; } return _tableHeaderView; } -(UIImageView *)imageView{ if (!_imageView) { _imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, SCREENWIDTH, 100)]; _imageView.autoresizingMask=UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; _imageView.clipsToBounds=YES; _imageView.contentMode=UIViewContentModeScaleAspectFill; } return _imageView; } UITableViewDelegate实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [self.data count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:CellIdetifier]; [cell.textLabel setText:self.data[indexPath.row]]; return cell; } ViewDidLoad中初始化imageView: 1 2 3 4 5 6 self.data=@[ @"FlyElephant" , @"博客园" , @"UITableView图片放大" , @"http://www.cnblogs.com/xiaofeixiang/" ]; self.imageView.image=[UIImage imageNamed: @"Girl" ]; self.imageView.contentMode=UIViewContentModeScaleAspectFill; [self.tableHeaderView addSubview:self.imageView]; self.tableView.tableHeaderView=self.tableHeaderView; [self.view addSubview:self.tableView]; 在UITableViewView向下拉动的过程中,改变imageView的位置: 1 2 3 4 5 6 7 8 9 10 -( void )scrollViewDidScroll:(UIScrollView *)scrollView{ CGPoint offset = scrollView.contentOffset; if (offset.y < 0) { CGRect rect =self.tableHeaderView.frame; rect.origin.y = offset.y; rect.size.height =CGRectGetHeight(rect)-offset.y; self.imageView.frame = rect; self.tableHeaderView.clipsToBounds=NO; } } 实现起来比较简单,希望对有需要的人有所帮助~ 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5129073.html,如需转载请自行联系原作者

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

前端开发常见问题精选(一)

一、如何在元素自身及其父级宽高不确定的情况下让元素水平和垂直方向上居中? 这个问题最常见的就是让文字在浏览器窗口中水平和垂直方向居中了,因为文字的宽度和高度均不确定,浏览器窗口的宽高我们也不知道,那这个问题该如何解决呢? 1、50%定位+translate居中法 html,body{ height: 100%;} .text{ position:absolute; top:50%; left:50%; transform:translate(-50%,-50%);} 2、Flexbox居中法 html,body{ display: flex; justify-content: center; align-items: center; width: 100%; height: 100%;} /*注意这里得写宽度属性*/ 3、Flexbox+margin居中法 html,body{ display: flex; width: 100%; height: 100%;} /*注意这里得写宽度属性*/ .text{ margin: auto;} 其实,关于CSS中的居中方法在我之前的纯CSS七大居中方法这篇文章中已经列举出来了,只不过符合问题中不定宽高条件的只有以上三种方法。 二、Date()对象时间参数格式问题 这个问题说大不大,说小也不小,怕就怕遇到问题时纠结半天都找不到根结所在。举个例子吧~~ var date = new Date("2017-08-04 08:00"); document.write(date); 这段代码在页面上的输出结果是什么? 正常来说应该输出的是标准时间格式: Fri Aug 04 2017 08:00:00 GMT+0800 然而,经过本人测试发现,IE下全军覆没,IE8及其以下浏览器输出NaN,IE8以上浏览器输出Invalid Date ,IOS系统下的所有浏览器也均输出Invalid Date。 那此类问题该如何解决呢? 很简单,将时间参数改为 2017/08/04 08:00 这样的格式就好啦! 三、IOS系统中动态生成的html元素绑定点击事件失效问题如何解决? 我们先来谈谈如何给动态生成的html元素绑定点击事件。 在jquery早期版本中我们可以使用bind()来实现,然而后面建议我们改用on()来实现同样效果,具体用法如下: $(document).on('click','需要绑定事件的元素',function(){}); 例如: $(document).on('click','#btn',function(){ alert('你点击了这个按钮!'); }); $('body').prepend('<div id="btn">按钮</div>'); 以上方法其实就已经解决了绑定点击事件问题,但是在IOS系统下我们需要注意一个问题,那就是在非a标签的元素中可能仍然会存在点击事件失效的问题,这时的解决方案就是给该元素的CSS中加上cursor: pointer这个属性。 四、IOS系统中overflow: auto滑动不流畅如何解决? 又来一个IOS下的坑! 我们制作手机H5的时候,有时候可能需要模拟页面默认的滚动条,这时我们可以使用overflow: auto就很轻松的解决了这个问题,但是却发现在IOS系统中添加了overflow: auto的元素并不能像默认长页面滑动那么流畅,我们手指停止滑动时,页面并不会随着惯性继续滚动一段距离,而是直接停止。其实该问题解决也很简单,直接在该元素上继续添加一个CSS属性-webkit-overflow-scrolling : touch就好。 五、如何使用纯CSS实现单行和多行文本溢出省略? 1、单行文本溢出省略 .ellipsis{ overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} 2、多行文本溢出省略 /*-webkit-line-clamp属性是用来限制行数的,本例是限制两行*/ .mul-ellipsis{ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden;} 看到-webkit-前缀,你就应该知道该方法只适用于移动端,PC端若要实现同样效果的话,额。。貌似只有在后端限制文字字数效果更好了吧。 六、如何解决元素高度从0变为auto时过渡效果无效的问题? 我们可以使用CSS3中的transition属性来实现过渡效果,但是只能对数值有效而对于像auto这样的属性值是无效的,所以若想要实现元素高度从0逐渐变化为auto的效果,可以使用max-height属性来替代height。 以上是我在工作当中所遇到的一些问题总结,在此与大家共勉!

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

Android开发万能圆角ImageView

作者简介 大家好,新的一周又开始了!本篇来自 马云飞 的投稿,分享了如何实现圆角图片,希望能帮助有需要的朋友。 马云飞 的博客地址: http://blog.csdn.net/sw950729 正文 最近一两个月没事做,然后就开始封装一些东西,昨天上司让我帮他做的圆角图片。思路自然是和网上的demo不一样的。 网上demo的效果: 差不多应该是这样的,但是容易出一些问题,比如你的图片本身就是个圆角?又或者图片太大,你想缩小显示,但出现显示内容不全? 我想实现的效果是这样的: 图画的较丑,见谅。 意思就是以他的宽高的最小值,为正方形的宽给他做圆角,当然长方形也可以的,因为我试了效果,没有问题,你们到时候可以自己尝试。 参考文章: http://blog.csdn.net/lmj623565791/article/details/41967509 这是翔神的文章,不过他的效果,并不是我想要的,因为,他的绘图是从(0,0)点然后截取宽高绘图,并不是我想要的重中间截取,然后绘图。 大体代码和他的差不多。不过依旧删除了一些无用的代码(哈哈,这个我抄代码的特性,没用放着干嘛,碍眼。) 好了下面上代码。初始化: 这边我用到了dp2px。这个就是将dp转换成px。网上代码一堆~: 既然继承了ImageView,少不了的自然是onMeasure方法: 下面就是重点了,对 bitmapshader 不了解的,去看看这个: http://blog.csdn.net/aigestudio/article/details/41799811 设置bitmapshader的代码如下: 如果有人看了前面我给的参考文章,那么,你可以发现,我把这个类的代码进行了改动,差不多就是把图片的起点坐标从(0,0)移动到了我想要的起点。 至于为什么,我们打开ImageView的源码,找到Center_Crop。这快代码的意思差不多是将图片居中把。 来,我们上源码: 他怎么计算的scale我们别管它,重点是如何计算他的dx和dy。 这里我就举个例子来计算。drawable的宽和高是(300,200)。我要绘制的view的宽高是(200,200)。按照 我的思路绘图是从(50,0)到(250,250),而不是(0,0)到(200,200)。 话不多说。我们看源码的计算: 我们画图,来说明这一切,看完图,你或许就懂了。 红色框是我们之后的,那这样,1这块区域可以理解成没了。销毁了。但是实际的效果是这样: 圆形好像看似没什么问题,那你们自己看圆角图片左边是不是被拉伸,这个拉伸距离应该刚好是我们之前计算得到的50dp。因为上图的1那块已经不存在了,所以你画图的时候那快距离就是拉伸的距离。现在我们看看-50dp的图。 1 的部分被移出去了。但他依然是存在的,所以绘制的图是不会出现任何拉伸的。perfect~ 属性配置完了,剩下的就是ondraw方法咯。很简单,代码如下: 当然你也得考虑到 onsizechanged 的时候,代码也不多: 好了。在这边我补上attrs属性: 现在。一个完美的,万能的圆角ImageVIew就解决了。不过好像还缺点什么,对了。自行修改圆角,自行修改类型,加上这个才算完美。 附上代码: 现在我们新建个xml。放2张图片。一个圆角,一个圆形,先看看效果如何: 多张图片在外层加一个scrollview。好了。我们来看一下效果: 完美~~ 圆角大小自行修改。类型自行修改。好了。今天主要内容就这么多把。整理了2个多小时~也是够够的。 作者:马云飞 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

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等操作系统。

用户登录
用户注册