任何问题请联系WX:uu16853

买模板送网站采集器 让你轻松放开双手运营网站!

购买更多有优惠!

TextView多行本文滚动轻松实现 Android开发技术

  Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局。只要在layout中简单设置几个属性就可以轻松实现   <TextView      android:id="@+id/tvCWJ"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:scrollbars="vertical"   <!–垂直滚动条 –>    android:singleLine="false"       <!–实现多行 –>    android:maxLines="15"            <!–最多不超过15行 –>    android:textColor="#FF0000"    />     当然我们为了让TextView动起来,还需要用到TextView的setMovementMethod方法设置一个滚动实例,代码如下    TextView tvAndroid123 = (TextView)findViewById(R.id.tvCWJ);   tvAndroid123.setMovementMethod(ScrollingMovementMethod.getInstance());   // Android开发网提示相关的可以查看SDK中android.text.method分支了解更多  

Android中内嵌字体实现个性化 Android开发技术

  在Android中我们的应用可以灵活的内嵌自己的字体文件,实现各个手机上可以正常的显示个性化文字,我们都知道TextView的setTypeface方法可以设置目标文字的显示特性,比如字体、颜色、粗体、斜体等。我们直接找一个TrueTypeFont的字体文件即.ttf,对于Win32系统的用户可以直接在Windows/fonts文件夹中能找到很多。比如微软雅黑就不错,可是体积太大,由于Android的Assets类有单个文件1MB体积的限制,我们先找个英文字体做测试。这里我们将字体文件android123.ttf放到工程的assets文件夹的fonts目录中。      Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/android123.ttf");        TextView tv = (TextView)findViewById(R.id.text);            tv.setTypeface(tf);    //设置TextView的风格        tv.setText("CWJ Test");           tv.setTextSize(12);          tv.setTextColor(Color.RED);         

Odex文件的作用以及介绍 Android开发技术

  细心的网友可能发现Android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? Android123提示大家,如果你仔细观察会发现文件名时一一对应的,同时那些对应的apk文件中没有dex文件。这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无法正常导出使用。   很多网友可能想到的是合并odex和apk变成apk中包含dex文件的,这样合并后最终apk文件安装在/data/中,而rom存放时在/system/bin中,所以最终导致了用户可装在Android手机中的软件会变少,占用系统空间。   一、APK生成odex文件方法:   编译开源GIT上的build/tools/dexpreopt/dexopt-wrapper这个,使用dexopt-wrapper即可,操作步骤   将dexopt-wrapper放到/data/local目录中,使用adb shell执行linux命令行,使用cd命令进入/data/local目录,   cd /data/local   ./dexopt-wrapper android123.apk android123.odex  二、合并odex和 少dex的apk 为完整的apk文件    1. 下载 http://smali.googlecode.com/files/smali-1.2.2.jar 和 http://smali.googlecode.com/files/baksmali-1.2.2.jar,既然是需要盗版,还需要odex所在rom中的一些引用类,一般在 /system/framework 目录中    2 .  通过odex生成class文件           java -jar baksmali-1.2.2.jar -x android123.odex          执行完上面这行命令后,会生成一个out 文件夹里面是android123.odex的class文件。出现问题,根据提示可以从rom的 /system/framework 中的xxx.jar放到pc上的java环境变量中一起生成。   3. 通过class生成classes.dex 文件。         java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex   4. 将classes.dex放到apk文件         […]

Android中Intent对应的category列表大全 Android开发技术

  在Android中使用Intent对应的category列表最全版本如下,更新到了Android 2.2 API Level8,Android123提示注意后面部分固件必须相应版本才可以调用  Android 1.5、1.6 android.intent.category.ALTERNATIVE   android.intent.category.BROWSABLE   android.intent.category.DEFAULTandroid.intent.category.DEVELOPMENT_PREFERENCE   android.intent.category.EMBED   android.intent.category.HOME   android.intent.category.INFO   android.intent.category.LAUNCHER   android.intent.category.MONKEY   android.intent.category.OPENABLE   android.intent.category.PREFERENCE   android.intent.category.SELECTED_ALTERNATIVE   android.intent.category.TAB   Android 2.0,2.0.1,2.1 新增车座和充电座 android.intent.category.CAR_DOCK   android.intent.category.DESK_DOCK  Android 2.2 新增行车模式 android.intent.category.CAR_MODE 

Android Intent大全更新到API Level8 Android开发技术

  对于Android开发者而言Intent可以帮助我们快速的处理隐式调用,相关的action列表大全如下,可以帮助最近给Android123邮件的网友解决一些问题:   Android 1.5 API Level3 android.intent.action.ALL_APPS   android.intent.action.ANSWER   android.intent.action.ATTACH_DATA   android.intent.action.BUG_REPORT   android.intent.action.CALL   android.intent.action.CALL_BUTTON   android.intent.action.CHOOSER   android.intent.action.CREATE_LIVE_FOLDER   android.intent.action.CREATE_SHORTCUT   android.intent.action.DELETE   android.intent.action.DIAL   android.intent.action.EDIT   android.intent.action.GET_CONTENT   android.intent.action.INSERT   android.intent.action.INSERT_OR_EDIT   android.intent.action.MAIN   android.intent.action.MEDIA_SEARCH   android.intent.action.PICK   android.intent.action.PICK_ACTIVITY   android.intent.action.RINGTONE_PICKER   android.intent.action.RUN   android.intent.action.SEARCH   android.intent.action.SEARCH_LONG_PRESS   android.intent.action.SEND   android.intent.action.SENDTO   android.intent.action.SET_WALLPAPER   android.intent.action.SYNC   android.intent.action.SYSTEM_TUTORIAL   android.intent.action.VIEW   android.intent.action.VOICE_COMMAND   android.intent.action.WEB_SEARCH   android.net.wifi.PICK_WIFI_NETWORK   android.settings.AIRPLANE_MODE_SETTINGS   android.settings.APN_SETTINGS   android.settings.APPLICATION_DEVELOPMENT_SETTINGS   android.settings.APPLICATION_SETTINGS   android.settings.BLUETOOTH_SETTINGS   android.settings.DATA_ROAMING_SETTINGS   android.settings.DATE_SETTINGS   android.settings.DISPLAY_SETTINGS   android.settings.INPUT_METHOD_SETTINGS   android.settings.INTERNAL_STORAGE_SETTINGS   android.settings.LOCALE_SETTINGS   android.settings.LOCATION_SOURCE_SETTINGS   android.settings.MANAGE_APPLICATIONS_SETTINGS   android.settings.MEMORY_CARD_SETTINGS   android.settings.NETWORK_OPERATOR_SETTINGS   android.settings.QUICK_LAUNCH_SETTINGS   […]

Android按键事件映射表和转义符对照 Android开发技术

         很多开发者表示不知道如何在Android的layout布局文件中输入类似&这样的符号,下面Android123整理了下一些案件事件映射和转义符对照表,比如说 & 在layout.xml中应该\uff06同时,从下表可以看到&和7在键盘上是同一个位置。 KeyEvent.KEYCODE_UNKNOWN,            KeyEvent.KEYCODE_SOFT_LEFT,            KeyEvent.KEYCODE_SOFT_RIGHT,            KeyEvent.KEYCODE_HOME,            KeyEvent.KEYCODE_BACK,            KeyEvent.KEYCODE_CALL,            KeyEvent.KEYCODE_ENDCALL,            KeyEvent.KEYCODE_0 | (‘\uff09’ << SHIFT_FWCH), // )            KeyEvent.KEYCODE_1 | (‘\uff01’ << SHIFT_FWCH), // !            KeyEvent.KEYCODE_2 | (‘\uff20’ << SHIFT_FWCH), // @            KeyEvent.KEYCODE_3 | (‘\uff03’ << SHIFT_FWCH), // #            KeyEvent.KEYCODE_4 | (‘\uffe5’ << SHIFT_FWCH), // $ – fullwidth Yuan            KeyEvent.KEYCODE_5 | (‘\uff05’ << SHIFT_FWCH), // %            KeyEvent.KEYCODE_6 […]

Android程序内存管理必读 Android开发技术

  很多开发者都是从J2ME或J2EE上过来的,对于内存的使用和理解并不是很到位,Android开发网本次给大家一些架构上的指导,防止出现豆腐渣工程的出现。Android作为以Java语言为主的智能平台对于我们开发一些高性能和质量的软件来说了解Android程序内存管理机制是必须的。 Android的Dalvik VM在基础方面和Sun JVM没有什么大的区别仅仅是字节码的优化,我们要知道什么时候用gc什么时候用recycle以及到底用不用finalization,因为Java对内存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。   1.对于常规开发者而言需要了解 Java的四种引用方式,比如强引用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。  2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,这里Android123提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。  3.Android为每个程序分配的对内存可以通过Runtime类的totalMemory() freeMemory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Dalvik.VMRuntime类的getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences() 方法,获取更多的运行内存。  4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。  5. 不要在循环中创建过多的本地变量。  有关Android和Java的系统性能分析,Android123将在以后的文章中详细讲述如何调试Java分析内存泄露以及Android上的gdb调试器分析得出内存性能改进。

Android游戏开发之旅一 长按Button原理 Android开发技术

  今天Android123开始新的Android游戏开发之旅系列,主要从控制方法(按键、轨迹球、触屏、重力感应、摄像头、话筒气流、光线亮度)、图形View(高效绘图技术如双缓冲)、音效(游戏音乐)以及最后的OpenGL ES(Java层)和NDK的OpenGL和J2ME游戏移植到Android方法,当然还有一些游戏实现惯用方法,比如地图编辑器,在Android OpenGL如何使用MD2文件,个部分讲述下Android游戏开发的过程最终实现一个比较完整的游戏引擎。相信大家都清楚Android Market下载量比较好的都是游戏,未来手机网游的发展相信Android使用的Java在这方面有比iPhone有更低的入门门槛。   对于很多游戏使用屏幕控制一般需要考虑长按事件,比如在动作类的游戏中需要长按发射武器,结合Android Button模型,我们实现一个带图片的Button的长按,为了更清晰的显示原理,Android开发网这里使用ImageButton作为基类   public class RepeatingImageButton extends ImageButton {     private long mStartTime; //记录长按开始    private int mRepeatCount; //重复次数计数    private RepeatListener mListener;    private long mInterval = 500; //Timer触发间隔,即每0.5秒算一次按下        public RepeatingImageButton(Context context) {        this(context, null);    }     public RepeatingImageButton(Context context, AttributeSet attrs) {        this(context, attrs, android.R.attr.imageButtonStyle);    }     public RepeatingImageButton(Context context, […]

Android游戏开发之旅二 View和SurfaceView Android开发技术

  在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。这里我们说下android.view.View和android.view.SurfaceView。SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,到底有哪些优势呢? SurfaceView可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取,相关的有Canvas  lockCanvas()  Canvas  lockCanvas(Rect dirty)  、void  removeCallback(SurfaceHolder.Callback callback)、void  unlockCanvasAndPost(Canvas canvas) 控制图形以及绘制,而在SurfaceHolder.Callback 接口回调中可以通过下面三个抽象类可以自己定义具体的实现,比如第一个更改格式和显示画面。 abstract void  surfaceChanged(SurfaceHolder holder, int format, int width, int height) abstract void  surfaceCreated(SurfaceHolder holder) abstract void  surfaceDestroyed(SurfaceHolder holder)   对于Surface相关的,Android底层还提供了GPU加速功能,所以一般实时性很强的应用中主要使用SurfaceView而不是直接从View构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。 

Android游戏开发之旅三 View类详解 Android开发技术

  在Android游戏开发之旅二中我们讲到了View和SurfaceView的区别,今天Android123从View类开始着重的介绍Android图形显示基类的相关方法和注意点。   自定义View的常用方法:  onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发 onSizeChanged(int, int, int, int) 当view的大小发生变化时触发 onDraw(Canvas) view渲染内容的细节 onKeyDown(int, KeyEvent) 有按键按下后触发 onKeyUp(int, KeyEvent) 有按键按下后弹起时触发 onTrackballEvent(MotionEvent) 轨迹球事件 onTouchEvent(MotionEvent) 触屏事件 onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发  onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发 onAttachedToWindow() 当view被附着到一个窗口时触发 onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和  onAttachedToWindow() 是相反的。 onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发   以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:   @Override   protected void onDraw(Canvas canvas) {    //这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色    […]

Android游戏开发之旅四 Canvas和Paint实例 Android开发技术

  昨天我们在Android游戏开发之旅三 View详解中提到了onDraw方法,有关详细的实现我们今天主要说下Android的Canvas和Paint对象的使用实例。   Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,下面是Canvas类常用的方法,当然Android开发网提示大家很多方法有不同的重载版本,参数更灵活。   void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域   void drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象    void  drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)   //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(Android123提示这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。    void  drawLine(float startX, float startY, float stopX, float stopY, Paint paint)  //画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint画刷对象。   void  drawPoint(float x, float y, Paint paint) //画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。   void drawText(String text, […]

Android游戏开发之旅五 Path和Typeface Android开发技术

   今天我们继续处理上次 Android游戏开发之旅四 Canvas和Paint实例 中提到的Path路径和Typeface字体两个类。对于Android游戏开发或者说2D绘图中来讲Path路径可以用强大这个词来形容。在Photoshop中我们可能还记得使用钢笔工具绘制路径的方法。Path路径类在位于android.graphics.Path中,Path的构造方法比较简单,如下    Path cwj=new Path();  //构造方法    下面我们画一个封闭的原型路径,我们使用Path类的addCircle方法    cwj.addCircle(10,10,50,Direction.CW); //参数一为x轴水平位置,参数二为y轴垂直位置,第三个参数为圆形的半径,最后是绘制的方向,CW为顺时针方向,而CCW是逆时针方向。     结合Android上次提到的Canvas类中的绘制方法drawPath和drawTextOnPath,我们继续可以在onDraw中加入。    canvas.drawPath(cwj,paintPath); //Android123提示大家这里paintPath为路径的画刷颜色,可以见下文完整的源代码。    canvas.drawTextOnPath("Android123 – CWJ",cwj,0,15,paintText); //将文字绘制到路径中去,有关drawTextOnPath的参数如下:    方法原型public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)    参数列表 text  为需要在路径上绘制的文字内容。 path 将文字绘制到哪个路径。  hOffset   距离路径开始的距离vOffset   离路径的上下高度,这里Android开发网提示大家,该参数类型为float浮点型,除了精度为8位小数外,可以为正或负,当为正时文字在路径的圈里面,为负时在路径的圈外面。 paint  最后仍然是一个Paint对象用于制定Text本文的颜色、字体、大小等属性。   下面是我们的onDraw方法中如何绘制路径的演示代码为:    @Override   protected void onDraw(Canvas canvas) […]

微信机器人 WordPress 插件升级到 1.1 版本

微信机器人升级到 1.1 版本,这个版本主要修正由于公众平台接口更新引起的新用户订阅问题和可以让用户设置默认的缩略图: 修正新用户订阅提示问题:公众平台接口更新,新用户订阅将由之前推送一条“Hello2BizUser”文本,变化为推送一条“subscribe”的事件。1.1 版本也支持这个事件了,现在新用户订阅也可以正常回复了。 新增 WEIXIN_DEFAULT 常量:可以用来设置在没有缩略图时候的默认缩略图。 下载:微信机器人 WordPress 插件 1.1 版本 详细介绍:微信机器人 WordPress 插件:让你的微信公众账号自动回复用户 标签:WordPress 插件 微信

WordPress 技巧:去掉评论模块中的网站链接表单

在 WordPress 的评论模块中,有填写网站地址或者链接的表单,有时候我们想去掉它,因为有很多人来发垃圾评论,目的就是用用户名做关键词,填写一个链接,吸引浏览者去点击它。 想要去掉这个链接表单,一般想到的方法就是找到 comments.php 文件中的对应表单代码删掉。但是现在只需要一段非常简单的代码就可以去除: add_filter('comment_form_default_fields', 'unset_url_field'); function unset_url_field($fields){ if(isset($fields['url'])) unset($fields['url']); return $fields; } 只需要把上面代码添加到主题中的 functions.php 文件中,即可删除 网站链接 表单。妈妈再也不用担心博客上垃圾评论太多了:D 标签:WordPress 技巧

如何解决 WordPress“addComment is not defined”的错误

出现 addComment is not defined 这个问题是折腾 WordPress 评论的,出现这错误现象是在评论中,点击“回复”无反应,查找了一些老外的说法,各有各的说法,有说是 WordPress 2.7 开始遗留的问题,有些说的插件的问题,也有说是主题中 functions.php 的问题。 我自己博客也出现了 addComment is not defined 的问题,总结了下状况和一些方法,应该是插件或者主题 functions.php 的问题,十有八九是由于js的原因。 解决办法: 在主题文件header.php的 </head> 标签前加入 <?php if ( is_singular() ) wp_enqueue_script( 'comment-reply' );?> 即可。

rel=”category tag” 的使用与思考

在网站优化中,对于a标签的优化可以增加rel属性,例如WordPress的分类链接标签是加上了 rel=”category tag”。rel 属性还有更多的应用,之前我在WordPress 友情链接增加 external nofollow,这也是一种优化方法。下面说说对于 rel=”category tag”的使用。 是否使用rel=”category tag” Denis 童鞋写的“解决 rel=”category tag” 问题以便通过 W3C 验证”值得参考和使用,我在思考去掉 rel=”category tag” 我们还不如去优化 rel=”category tag”。 WordPress rel=”category tag” 优化 rel=”category tag” 没有得到 W3C 的 HTML5 验证器的认可,那么我们不去掉,换个W3C认可的:rel=”archive”。 add_filter( 'the_category', 'wpjam_fix_catgory_rel' ); function wpjam_fix_catgory_rel ( $text ) { $text = str_replace('rel="category tag"', 'rel="archive"', $text); return $text; } 将以上代码放到主题文件functions.php中即可,我已经在博客上启用,大家可以查看下文章标题下面的分类a标签中的rel属性。 关于rel=”archive”的一些参考资料: The referenced document […]

WordPress 技巧:只在相关页面导入 Contact Form 7 的 JS 和 CSS

Contact Form 7 是一个非常强大并且易用的联系表单的插件,我在很多项目中都用到它,但是这个插件有个很不好的地方,会在整个博客的所有前台页面都导入 Contact Form 7 的 JavaScript 和 CSS 代码,对于性能要求极致的我们,当然不允许这样的事情发生,所以我们可以通过下面的代码实现只在含有 Contact Form 7 表单的页面导入 Contact Form 7 的 JS 和 CSS 代码。 add_action ( 'wp_enqueue_scripts', 'wpjam_cf7_enqueue_scripts', 99 ); function wpjam_cf7_enqueue_scripts(){ wp_dequeue_script('contact-form-7'); if(is_page('contact')){ $in_footer = true; if ( 'header' === WPCF7_LOAD_JS ) $in_footer = false; wp_enqueue_script( 'contact-form-7', wpcf7_plugin_url( 'includes/js/scripts.js' ), array( 'jquery', 'jquery-form' ), […]

WordPress 教程:自定义页面(Page)的模板样式

WordPress 中存在两种信息发布形式:文章(Post)和页面(Page),在写如何自己定义某个页面的特殊样式之前,有必要为一些新手简单介绍一下它们之间的区别,已经了解的朋友请跳过本节。 WordPress 中文章(Post)和页面(Page)的区别 WordPress 既然作为一个小型的 CMS 系统,文章肯定是最核心的内容。WordPress 中的文章是正文主体内容,一般可以随时修改、变动,文章之间有比较明确的时间、分类、标签等等相关关系。 而一个 CMS 中,肯定不能只包含正文文章,一般在底部都包含了诸如“关于我们”、“联系我们”等页面,WordPress 中的页面就是比较静态比较固定内容的页面,一般是独立的,与其他内容不太相关。如果有相关的内容,一般是父子关系,即父页面下面的子页面。而且页面可以很方便的定义“别名”(slug),也就是方便的自定义页面的链接。 自定义 WordPress 中的页面(Page)模板 页面结构、样式,在 WordPress 的主题目录中的 page.php 中定义,所有的页面都是一种结构和样式下,只是替换了一些内容而已。这势必无法满足我们的一些个性需求。 举个例子,一般来说页面的模板就跟文章的模板差不多,一个标题加上正文内容和下面评论。如果我博客的某个页面,想要展示的是我的作品集,而我的作品集想用一些并排的方块样式展示而不是以传统文章的形式展示。那么,就需要来自定义这个页面模板了。强大的 WordPress 系统已经考虑到我们这种合理的不合理需求,并提供了两种强大的自定页面的方法: 在后台选项指定当前页面要调用的模板文件 使用主题文件优先级规则来覆盖默认页面模板 在通过这两种方法自定义页面样式之前,请先确保你已经做出了一个可以使用的页面模板文件,不然的话本文是没有什么意义的。为了简便,本人用几个字来做演示。 在后台指定当前页面要调用的模板文件 当我们新建或者编辑一个页面的时候,在右侧的“页面属性”一栏里面会有一个“模板”选项,里面提供了可以选择的模板,我们只需要选中某个模板,就可以对当前的页面使用这个模板来显示。 你可能会问,为什么我的页面编辑页面没有这个选项?只有你的主题至少包含一个页面模板,这个地方才会检测出来并显示出来,然后提供选择。如果你没有自定义的页面模板,有什么必要出现这个选项? 我们现在就来创建自己的模板文件,方法很简单: 随便新建一个文件,然后自己写好 HTML 结构和对应的 CSS 样式以及 WordPress 的内容调用函数等,然后在最顶部加上如下的注释: <?php /* Template Name: 潜行者m 的 page 模板测试 */ ?> 加上之后,你就制作了一个名字为“潜行者m 的 page 模板测试”的页面模板了。这个文件可以随便命名,而且可以随便放在一个新建的文件夹中。一般比较推荐的方法是,新建一个名为“page-template”或者相关名字的文件夹,专门用来放置页面模板。只要某个文件带有这个注释并且放置在当前主题的目录中,就会被 WordPress 发现,然后就会出现在后台的选项中。 再说一下,这个页面模板可以是任意的内容,不一定复制原有的结构,可以自由发挥。如果没有调用什么 […]

WordPress 技巧:设置好评并输出

一些评论比较多的媒体站,管理员会把一些用户写的好评单独输出在侧边栏,但是怎么设置好评和输出呢?我们可以在 WordPress 后台评论管理界面评论管理区添加一个新的好评动作,并且通过 WP_Comment_Query 这个 Class 输出所有好评。 详细代码如下: <?php /* Plugin Name: WPJAM 好评 Plugin URI: http://blog.wpjam.com/m/wpjam-good-comments/ Description: 管理员可以在后台留言列表设置某条评论为好评,在前台通过<code>wpjam_get_good_comments</code>调用所有好评的评论。 Version: 0.1 Author: Denis Author URI: http://blog.wpjam.com/ */ add_filter('comment_row_actions','wpjam_good_comments_comment_row_actions',10,2); function wpjam_good_comments_comment_row_actions($actions, $comment ){ if(get_comment_meta( $comment->comment_ID, 'good_comment',true) == '1'){ $actions['good_comment'] = '<a href="'.home_url('/wp-admin/edit-comments.php?good_comment=0&comment_id='.$comment->comment_ID).'">取消好评</a>'; }else{ $actions['good_comment'] = '<a href="'.home_url('/wp-admin/edit-comments.php?good_comment=1&comment_id='.$comment->comment_ID).'">好评</a>'; } return $actions; } add_action('admin_head','wpjam_good_comments_admin_head'); function wpjam_good_comments_admin_head(){ if(isset($_REQUEST['good_comment'])){ if($_REQUEST['good_comment'] […]

WordPress 技巧:给每个页面都设置不同的菜单

做项目总是有一些很奇怪的要求,比如有些客户需要给每个页面设置不同的菜单,但是这些总是难不倒 WordPress: <?php /* Plugin Name: WPJAM 自定义菜单 Plugin URI: http://wpjam.com Description: 实现每个页面都设置不同的菜单 Version: 0.1 Author: Denis Author URI: http://wpjam.com */ add_action('init','wpjam_register_nav_menus_init'); function wpjam_register_nav_menus_init(){ global $wpdb; $sql = "SELECT meta_value FROM {$wpdb->prefix}postmeta WHERE meta_key = 'nav_menu';"; $nav_menus = $wpdb->get_col($sql); if($nav_menus){ foreach ($nav_menus as $nav_menu){ if($nav_menu){ register_nav_menu( $nav_menu, $nav_menu); } } } } add_action('save_post', 'wpjam_save_nav_menu_options'); function […]

WordPress 技巧:当搜索结果只有一篇时直接重定向到日志

在 WordPress 进行搜索的时候,如果搜索结果只返回一篇日志的时候,最好的方法是直接重定向到该日志。 add_action('template_redirect', 'wpjam_redirect_single_post'); function wpjam_redirect_single_post() { if (is_search()) { global $wp_query; if ($wp_query->post_count == 1) { wp_redirect( get_permalink( $wp_query->posts['0']->ID ) ); } } } 标签:WordPress 技巧

5个使你 WordPress 网站更安全的好习惯

网站经常面对各种各样的威胁,比较常见的就是:黑客攻击、服务器崩溃导致数据丢失。本文介绍五个运营 WordPress 需要具备的好习惯,形成习惯之后,可以提高你的 WordPress 站点的安全性。 1. 经常备份网站数据 这个习惯是必须的,即使是再安全的服务器也有崩溃损失文件的可能性,此外如果网站被黑客攻击了,也会造成文件丢失或被修改。最简单有效的方法当然就是备份数据了。但是备份数据也是需要有一定的规划,不能说想备份的时候就备份,忙的时候就算了。当然,也有一些比较懒的备份方法,那就是使用 WordPress 数据备份插件。一般比较常用的有: BackWPup BackUpWordPress 特别推荐 BackWPup 这个插件,设置一下就可以自动执行备份操作,而且可以自动把备份保存到第三方存储服务(通常是网盘)上。关于网站备份的一些经验,推荐潜行者m的这篇文章:如何进行高效有序的网站备份。 2. 使用复杂的密码 这一点不用多说了,很多被入侵事件都是因为账户设置了一个比较简单的密码(弱口令),让黑客配合社会工程学或者暴力测试轻松的破解出来。所以不仅仅是在自己的网站,在其他网站注册账号,也都要尽量使用一个复杂的密码,这样可以减少被猜出的几率。 特别要注意的是,一定不要使用 admin 作为你 WordPress 默认登陆帐户名,很多黑客工具都是用 admin 作为登陆尝试账号进行暴力猜解。 3. 安装可信的插件和主题 单纯的 WordPress 肯定无法满足复杂的需求了,往往需要安装一些插件和主题来提供个性化的需求。这时候,就要小心了。网上有很多 WordPress 主题分享站点,但是分享的这些主题,往往都是被这些网站修改了的,理论上说都是不安全的。很多 WordPress 站点被入侵事件,就是由于安装了网络上鱼目混杂的主题或者插件导致的。 虽然网络上也有一些比较成熟可靠的第三方主题插件分享平台,但是 WordPress 官方的主题库、插件库是绝对权威安全的(有志愿者亲测)。 此外,很多比较好的主题、插件,由于一些特殊原因无法提交官方,如果你想要使用那么请从主题、插件作者页面下载,不要相信那些经过二次修改、汉化过之类的,除了官方作者修改之外,别人的修改往往都有安全隐患。 4. 及时升级你的 WordPress WordPress 每次升级都会带来一些麻烦,例如某项功能取消了,某些函数废弃了等,这些问题可能会导致你的主题、插件的部分功能无法使用,还需要进一步升级主题、插件等等。但是,我们还是要尽量把 WordPress 升级到最新版本。原因很简单,每次官方升级,都是修复一些 Bug ,这些 Bug 往往存在一些安全隐患。 WordPress 在安全更新日志中,都会提示修改了哪些 Bug ,如果你不升级的话被黑客得知你的 WordPress 版本,可能会通过相关的 […]

Android游戏开发之旅六 自定义View Android开发技术

  有关Android的自定义View的框架今天我们一起讨论下,对于常规的游戏,我们在View中需要处理以下几种问题: 1.控制事件 2.刷新View 3. 绘制View   1. 对于控制事件今天我们只处理按键事件onKeyDown,以后的文章中将会讲到屏幕触控的具体处理onTouchEvent以及Sensor重力感应等方法。   2. 刷新view的方法这里主要有invalidate(int l, int t, int r, int b) 刷新局部,四个参数分别为左、上、右、下。整个view刷新 invalidate(),刷新一个矩形区域 invalidate(Rect dirty) ,刷新一个特性Drawable, invalidateDrawable(Drawable drawable) ,执行invalidate类的方法将会设置view为无效,最终导致onDraw方法被重新调用。由于今天的view比较简单,Android123提示大家如果在线程中刷新,除了使用handler方式外,可以在Thread中直接使用postInvalidate方法来实现。   3. 绘制View主要是onDraw()中通过形参canvas来处理,相关的绘制主要有drawRect、drawLine、drawPath等等。view方法内部还重写了很多接口,其回调方法可以帮助我们判断出view的位置和大小,比如onMeasure(int, int) Called to determine the size requirements for this view and all of its children.  、onLayout(boolean, int, int, int, int) Called when this view should assign […]

Android游戏开发之旅七 自定义SurfaceView Android开发技术

  今天我们说下未来的Android游戏引擎模板架构问题,对于游戏我们还是选择SurfaceView,相关的原因Android123已经在Android游戏开发之旅二 View和SurfaceView中说的很清楚了,这里我们直接继承SurfaceView,实现SurfaceHolder.Callback接口,处理surfaceCreated、surfaceChanged以及surfaceDestroyed方法,这里我们并没有把按键控制传入,最终游戏的控制方面仍然由View内部类处理比较好,有关SurfaceView的具体我们可以参见Android开源项目的Camera中有关画面捕捉以及VideoView的控件实现大家可以清晰了解最终的用意。 public class cwjView extends SurfaceView implements SurfaceHolder.Callback {   public cwjView(Context context, AttributeSet attrs) {  super(context, attrs);  SurfaceHolder holder=getHolder();  holder.addCallback(this);       setFocusable(true); }  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {      }  public void surfaceCreated(SurfaceHolder holder) {     }  public void surfaceDestroyed(SurfaceHolder holder) {      }  @Override public void onWindowFocusChanged(boolean hasWindowFocus) {   }    }

Android游戏开发之旅八 SurfaceView类实例 Android开发技术

  有关SurfaceView我们将通过三个系统自带的例子来深入掌握Android绘图必会的SurfaceView,今天我们以SDK中的Sample游戏lunarlander中的LunarView具体实现,Android123建议大家导入该游戏工程到你的Eclipse然后自己编译先玩一下这个游戏,然后再看代码比较好理解。 class LunarView extends SurfaceView implements SurfaceHolder.Callback {    class LunarThread extends Thread {        /*         * Difficulty setting constants         */        public static final int DIFFICULTY_EASY = 0;        public static final int DIFFICULTY_HARD = 1;        public static final int DIFFICULTY_MEDIUM = 2;        /*         * Physics constants         */        public static final int PHYS_DOWN_ACCEL_SEC = 35;        public static […]

Android游戏开发之旅九 VideoView类剖析 Android开发技术

   有关SurfaceView相关的内容今天Android123继续延用系统的示例类VideoView来让大家深入了解Android平台的图形绘制基础类的实现原理。大家可能会发现VideoView类的控制方面无法改变,我们可以通过重构VideoView类来实现更个性化的播放器。     public class VideoView extends SurfaceView implements MediaPlayerControl {    private String TAG = "VideoView";    // settable by the client    private Uri         mUri;    private int         mDuration;     // all possible internal states    private static final int STATE_ERROR              = -1;    private static final int STATE_IDLE               = 0;    private static final int STATE_PREPARING          = 1;    private […]

Android游戏开发之旅十 位图旋转 Android开发技术

  今天有关Android游戏开发的基础,我们说下Bitmap相关的实用操作,这里我们就说下位图旋转。在Android中图形的旋转和变化提供了方便的矩阵Maxtrix类,Maxtrix类的setRotate方法接受图形的变换角度和缩放,最终Bitmap类的createBitmap方法中其中的重载函数,可以接受Maxtrix对象,方法原型如下   public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)  参数的具体意思source 源bitmap对象x  源坐标x位置y 源坐标y位置width  宽度height  高度 m  接受的maxtrix对象,如果没有可以设置为nullfilter 该参数仅对maxtrix包含了超过一个翻转才有效。   下面Android123给大家一个比较经典的例子,rotate方法是静态方法可以直接调用,参数为源Bitmap对象,参数二为旋转的角度,从0~360,返回值为新的Bitmap对象。其中具体的宽高可以调整。   public static Bitmap rotate(Bitmap b, int degrees) {        if (degrees != 0 && b != null) {            Matrix m = new Matrix();            m.setRotate(degrees,                    (float) b.getWidth() / 2, […]

Android游戏开发之旅11 View中手势识别 Android开发技术

   有关Android平台的游戏开发中我们需要涉及到控制,在开始的Android游戏开发之旅中我们提到了按键和轨迹球的控制方式,从今天开始Android123开始给出大家游戏中其他的一些控制方式,比如今天的手势操作和未来重力感应。   很多网友发现Android中手势识别提供了两个类,由于Android 1.6以下的版本比如cupcake中无法使用android.view.GestureDetector,而android.gesture.Gesture是Android 1.6才开始支持的,我们考虑到仍然有很多Android 1.5固件的网友,就来看下兼容性更强的android.view.GestureDetector。在android.view.GestureDetector类中有很多种重载版本,下面我们仅提到能够自定义在View中的两种方法,分别为GestureDetector(Context context, GestureDetector.OnGestureListener listener) 和 GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler) 和。我们可以看到第一个参数为Context,所以我们想附着到某View时,最简单的方法就是直接从超类派生传递Context,实现GestureDetector里中提供一些接口。   下面我们就以实现手势识别的onFling动作,在CwjView中我们从View类继承,当然大家可以从TextView等更高层的界面中实现触控。 class CwjView extends View {     private GestureDetector mGD;    public CwjView(Context context, AttributeSet attrs) {        super(context, attrs);              mGD = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {                    int […]

Android游戏开发之旅12 Sensor重力感应 Android开发技术

  从Android手机开始,主流的智能机纷纷加入了感应器Sensor硬件,常见的有光线感应器、重力感应器、加速感应器,而更高级的有磁极方向、陀螺仪、距离感应器、温度感应器等等。对于Android游戏开发,我们主要用到重力、加速、磁力和陀螺仪四种,当然部分游戏可能需要GPS或Cellid定位来修正一些位移信息。从系统中提高的感应器主要在android.hardware中,我们可以看到系统提供了android.hardware.SensorEventListener、Sensor和SensorManager这三个类,我们会发现除了可以获取感应器的信息,和感应器的原始数据外,并没有提供相关的逻辑处理。Android123将会分3篇来详细的介绍不同感应器的作用和逻辑处理,比如自由落体,晃动,磁极,当前的旋转速度。    未来Android123将完成主要是一个基于OpenGL 3D的雷电游戏,最终加入联网对战效果可以团队打怪实现手机3D网游充分发挥Android手机的娱乐能力。对于大多数新款Android手机可能没有配备轨迹球或导航键的方向控制,所以重力感应器是这类实时性较强游戏的首选控制方式。主要有以下几点问题对于Sensor   1. 降噪处理,如果做过LBS软件的大家可能明白偏移修正,在GPS无法正常获取数据较间断时地图不能乱飘,这里Sensor也不例外,除了使用采样数据平均值获取外,可以间隔采样的方法来处理。细节的算法我们将在下节给出示例代码。   2. 感应器的敏感度,在Android中提供了四种延迟级别分别为 SENSOR_DELAY_FASTEST 最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能,所以Android开发网不推荐大家使用。SENSOR_DELAY_GAME 游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别  int SENSOR_DELAY_NORMAL 标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。int SENSOR_DELAY_UI 用户界面延迟,一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用。  

Android游戏开发之旅13 Sensor感应示例 Android开发技术

  有关Android游戏开发中的Sensor感应示例今天我们将一起来讨论,对于目前最新的Android 2.2平台而言仍然没有具体的感应判断逻辑,下面我们一起定义下常用的感应动作事件。首先Android123提醒大家由于是三轴的立体空间感应所以相对于轨迹球、导航键的上下左右外,还提供了前后的感应,所以我们定义最基本的六种空间方向。  public static final int CWJ_UP = 0; public static final int CWJ_DOWN = 1; public static final int CWJ_LEFT = 2; public static final int CWJ_RIGHT = 4; public static final int CWJ_FORWARD = 8; //向前 public static final int CWJ_BACKWARD = 16; //向后   下面我们做精确的角度旋转修正值定义,我们用到yaw、pitch和roll,相信学过3D开发的网友不会对这些陌生的,我们就把他们对应为绕y、x、z轴的角度好了,如果你们没有学过3D相关的知识这里Android开发网推荐大家可以通过Cube例子自定义Render来观察这三个值对应立方体的旋转角度。 Yaw在(0,0,0)中, 以xOz的坐标平面中围绕y轴旋转,如果是负角则我们定义为CWJ_YAW_LEFT 即往左边倾斜,同理我们定义如下:  public static final int CWJ_YAW_LEFT = 0; public static […]

Android应用数本月将超过10万个 Android开发技术

  本月Android Market上的应用数量将超过10万个,赶超Apple App Store的日期屈指可数,但是在一年前Android Market的软件数量还不到1w个面对这样的发展速度,我们可以想象对于Android手机推动做出的巨大作用,很多人喜欢iPhone的原因除了高品质的硬件外,超酷的软件也是其中原因之一。   目前Android Market上比较缺少质量较高的游戏,比如Gameloft的游戏基本上可以用粗糙来形容,相对于在Market之外销售的EA公司的Android游戏而言有很大的差距,同时移动互联网未来的金矿将会转移到手机网游身上,诞生下一个盛大或者说史玉柱这样的公司或一夜成名的人才来说这是一个很好的机会。

Android游戏开发之旅14 游戏开发实战一 Android开发技术

  从今天开始Android123将开始带领大家进入Android游戏开发实战篇,本次我们首个游戏为2D的基于SurfaceView的类似横版卷轴游戏。第一天我们说下需要做哪些准备:   一、游戏地图编辑器,在J2ME时代我们可能都是用GIF分割多帧或BMP上放置多个图片通过减少文件头来压缩体积,但是在Android平台上开发游戏我们不需要那么节省,不过资源的释放仍然很重要,否则会出现OutOfMemoryError这样的悲剧发生。一般简单的2D平面游戏地图都是使用二维数组来标记的。我们可以想象矩阵中的每个元素对应每个图片资源。详细的存储方法我们将在下次具体讲到。   二、控制方式,由于横版过关类游戏不适合重力感应操作,我们这里选择屏幕下方加设一个区域,放置上、下、左、右按键,同时右侧给出常用的攻击、跳跃按钮,而游戏的暂停可以通过触控实现继续或暂停。   三、音效处理,常规的一般在攻击比如出拳、发射子弹的过程中有音效,或对手自己中弹(当然对于Android图形开发来说就是碰撞检测)时发出音效,跳跃、过关均会需要一些声音素材文件,一般的游戏还需要背景音乐配合烘托游戏气氛。   四、游戏逻辑,这是主要的地方,我们将通过实例代码让大家了解游戏开发中是如何的卷轴、人物的跳跃、攻击有效判断即碰撞检测,电脑智能等算法问题。   五、细节处理,比如计分,等级,游戏计时,关卡档案的存档,读取以及开场设计,关卡过渡的过场动画处理。   这里Android开发网提示大家,目前很多J2ME的游戏可以轻松的移植到Android平台,主要的细节只要了解Google Android平台的图形相关问题即可,主要是Bitmap、Drawable和View线程处理问题。

Android游戏开发之旅15 按键中断处理 Android开发技术

 有关Android平台上游戏开发中我们需要处理一些特别的按键事件,对于突发的事情我们需要特别的考虑,比如突然来电话了和游戏中按下一些特殊的键,比如拍照键  @Override    public boolean dispatchKeyEvent(KeyEvent event)    {           switch (event.getKeyCode())           {             case KeyEvent.KEYCODE_VOLUME_UP:   //音量键+             case KeyEvent.KEYCODE_VOLUME_DOWN:   //音量键-             case KeyEvent.KEYCODE_CAMERA:  //拍照键             case KeyEvent.KEYCODE_FOCUS:   //拍照键半按的对焦状态          //   event.getAction() == KeyEvent.ACTION_UP   //Android123提示如果按键按下后弹起时触发                           }                return true; //这些标记为处理过,则不在往内部传递         default:                break;        }        return super.dispatchKeyEvent(event);    }   对于游戏突然来电话我们一般采取通过PhoneStateListener类提供的public void onCallStateChanged (int state, String incomingNumber) 回调方法可以获取电话的状态,比如常规空闲时CALL_STATE_IDLE、来电时CALL_STATE_RINGING和CALL_STATE_OFFHOOK 摘机通话中,有关处理的细节网友可以查看Android Git项目中的Music,在Android开源项目中系统自带的音乐播放器可以很好的处理,比如在通话结束后恢复音乐播放,而我们游戏需要做的就是记住当前的游戏状态尽量数据持久化处理,不能因为长时间的通话,游戏的Activity被清理了,这里我们一般通过onSaveInstanceState来保存当前窗口的一些记录,通过Intent标记来让系统管理好我们游戏的生命周期。

100% Secure Checkout

PayPal / MasterCard / Visa