当前位置: 编程技术>移动开发
本页文章导读:
▪从网易资讯看离线阅读的实现思路 从网易新闻看离线阅读的实现思路
原文:http://miloisbadboy.com/archives/157这两天麦洛在做有关离线阅读的功能.关于离线阅读功能思路其实很简单,无非就是先将一些需要的数据下载到本地,当在不需.........
▪ UISplitView的简略示例 UISplitView的简单示例
以前写了一篇文章:UISplitView的简单示例,这篇文章实现的功能类似,具体的实现请参考附件。
SplitViewTestAppDelegate.h
#import <UIKit/UIKit.h>
@class RootViewController;
@class .........
▪ 相仿Chome的翻转效果 类似Chome的翻转效果
简单的demo,屏幕上下滑动翻转View,类似Android Chrome的效果
代码很简单,扩展一X轴旋转的动画RotateAnimationEX:
package com.ray.animation;
import android.graphics.Camera;
import .........
[1]从网易资讯看离线阅读的实现思路
来源: 互联网 发布时间: 2014-02-18
从网易新闻看离线阅读的实现思路
原文:
http://miloisbadboy.com/archives/157
这两天麦洛在做有关离线阅读的功能.
关于离线阅读功能思路其实很简单,无非就是先将一些需要的数据下载到本地,当在不需要网络的时候,可以从本地读取内容.
麦洛看了一下网易新闻的功能(当然具体实现麦洛也是不知道,只是从黑盒子里看看,麦洛自己的一些关于可能实现方式的想法,纯属学习).
阅读更多:
http://miloisbadboy.com/archives/157
原文:
http://miloisbadboy.com/archives/157
这两天麦洛在做有关离线阅读的功能.
关于离线阅读功能思路其实很简单,无非就是先将一些需要的数据下载到本地,当在不需要网络的时候,可以从本地读取内容.
麦洛看了一下网易新闻的功能(当然具体实现麦洛也是不知道,只是从黑盒子里看看,麦洛自己的一些关于可能实现方式的想法,纯属学习).
阅读更多:
http://miloisbadboy.com/archives/157
[2] UISplitView的简略示例
来源: 互联网 发布时间: 2014-02-18
UISplitView的简单示例
以前写了一篇文章:UISplitView的简单示例,这篇文章实现的功能类似,具体的实现请参考附件。
SplitViewTestAppDelegate.h
#import <UIKit/UIKit.h> @class RootViewController; @class DetailViewController; @interface SplitViewTestAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UISplitViewController *splitViewController; RootViewController *rootViewController; DetailViewController *detailViewController; } @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController; @property (nonatomic, retain) IBOutlet RootViewController *rootViewController; @property (nonatomic, retain) IBOutlet DetailViewController *detailViewController; @end
SplitViewTestAppDelegate.m
#import "SplitViewTestAppDelegate.h" #import "RootViewController.h" #import "DetailViewController.h" @implementation SplitViewTestAppDelegate @synthesize window, splitViewController, rootViewController, detailViewController; #pragma mark - #pragma mark Application lifecycle - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window addSubview:splitViewController.view]; [window makeKeyAndVisible]; return YES; } #pragma mark - #pragma mark Memory management - (void)dealloc { [splitViewController release]; [window release]; [super dealloc]; } @end
RootViewController.h
#import <UIKit/UIKit.h> @class DetailViewController; @interface RootViewController : UITableViewController { DetailViewController *detailViewController; NSMutableArray *fruits; } @property (nonatomic, retain) IBOutlet DetailViewController *detailViewController; @property (nonatomic, retain) NSMutableArray *fruits; @end
RootViewController.m
#import "RootViewController.h" #import "DetailViewController.h" @implementation RootViewController @synthesize detailViewController; @synthesize fruits; #pragma mark - #pragma mark View lifecycle - (void)viewDidLoad { [super viewDidLoad]; self.title = @"List of Fruits"; self.clearsSelectionOnViewWillAppear = NO; self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); self.fruits = [[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fruits" ofType:@"plist"]] retain]; } #pragma mark - #pragma mark Table view data source - (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { return [fruits count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.accessoryType = UITableViewCellAccessoryNone; } cell.textLabel.text = [self.fruits objectAtIndex:indexPath.row]; return cell; } #pragma mark - #pragma mark Table view delegate - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { detailViewController.detailItem = [self.fruits objectAtIndex:indexPath.row]; } #pragma mark - #pragma mark Memory management - (void)dealloc { [self.fruits release]; [detailViewController release]; [super dealloc]; } @end
DetailViewController.h
#import <UIKit/UIKit.h> @interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate> { UIPopoverController *popoverController; UINavigationBar *navigationBar; id detailItem; UILabel *detailDescriptionLabel; IBOutlet UIImageView *fruitImageView; } @property (nonatomic, retain) IBOutlet UINavigationBar *navigationBar; @property (nonatomic, retain) id detailItem; @property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel; @property (nonatomic, retain) IBOutlet UIImageView *fruitImageView; @end
DetailViewController.m
#import "DetailViewController.h" #import "RootViewController.h" @interface DetailViewController () @property (nonatomic, retain) UIPopoverController *popoverController; - (void)configureView; @end @implementation DetailViewController @synthesize navigationBar, popoverController, detailItem, detailDescriptionLabel, fruitImageView; #pragma mark - #pragma mark Managing the detail item - (void)setDetailItem:(id)newDetailItem { if (detailItem != newDetailItem) { [detailItem release]; detailItem = [newDetailItem retain]; navigationBar.topItem.title = detailItem; NSString *imageName = [NSString stringWithFormat:@"%@.png", detailItem]; [self.fruitImageView setImage:[UIImage imageNamed:imageName]]; [self configureView]; } if (popoverController != nil) { [popoverController dismissPopoverAnimated:YES]; } } - (void)configureView { detailDescriptionLabel.text = [detailItem description]; } #pragma mark - #pragma mark Split view support - (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc { barButtonItem.title = @"Master List"; [navigationBar.topItem setLeftBarButtonItem:barButtonItem animated:YES]; self.popoverController = pc; } - (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem { [navigationBar.topItem setLeftBarButtonItem:nil animated:YES]; self.popoverController = nil; } - (void)viewDidUnload { self.popoverController = nil; } #pragma mark - #pragma mark Memory management - (void)dealloc { [popoverController release]; [navigationBar release]; [detailItem release]; [detailDescriptionLabel release]; [super dealloc]; } @end
效果图:
[3] 相仿Chome的翻转效果
来源: 互联网 发布时间: 2014-02-18
类似Chome的翻转效果
简单的demo,屏幕上下滑动翻转View,类似Android Chrome的效果
代码很简单,扩展一X轴旋转的动画RotateAnimationEX:
package com.ray.animation; import android.graphics.Camera; import android.graphics.Matrix; import android.util.Log; import android.view.animation.Animation; import android.view.animation.Transformation; public class RotateAnimationEX extends Animation { private float mFromDegress, mToDegress; private float mCenterX, mCenterY; private Camera mCamera; private OnFlipListener mFlipListener; private boolean onFilpped; public RotateAnimationEX(float fromDegrees, float toDegrees, int centerX, int centerY) { mFromDegress = fromDegrees; mToDegress = toDegrees; mCenterX = centerX; mCenterY = centerY; mCamera = new Camera(); onFilpped = false; } public void setFlipListener(OnFlipListener listener) { mFlipListener = listener; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { mCamera.save(); float rotateAngle = mFromDegress + (mToDegress - mFromDegress)*interpolatedTime; Log.d("Trace", "angel" + rotateAngle); if (mFlipListener != null) { if (rotateAngle >= 90 && rotateAngle <=180 || rotateAngle <=-90 && rotateAngle >= -180) { if (!onFilpped) { mFlipListener.onFlip(); onFilpped = true; } } } mCamera.rotateX(rotateAngle); Matrix m = t.getMatrix(); mCamera.getMatrix(m); m.preTranslate(-mCenterX, -mCenterY); m.postTranslate(mCenterX, mCenterY); mCamera.restore(); } public interface OnFlipListener { void onFlip(); } }
一测试的ViewGroup:
package com.ray.animation; import com.ray.animation.RotateAnimationEX.OnFlipListener; import android.content.Context; import android.graphics.Camera; import android.graphics.Color; import android.graphics.Matrix; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.Transformation; public class TestViewGroup extends ViewGroup implements GestureDetector.OnGestureListener, OnFlipListener { public static final int MARGIN = 30; public static final int MAX_ROTATE_ANGLE = 90; private View mTestView; private RotateAnimationEX mRotaAnim; private GestureDetector mGestureDetector; private float rotateAngle = 0; private Camera mCamera; public TestViewGroup(Context context) { super(context); mTestView = new View(context); mTestView.setBackgroundColor(COLORS[0]); addView(mTestView); setStaticTransformationsEnabled(true); mGestureDetector = new GestureDetector(context,this); mCamera = new Camera(); } @Override protected boolean getChildStaticTransformation(View child, Transformation t) { if (child == mTestView) { mCamera.save(); Matrix m = t.getMatrix(); mCamera.rotateX(rotateAngle); mCamera.getMatrix(m); m.preTranslate(-child.getWidth() / 2, -child.getHeight() / 2); m.postTranslate(child.getWidth() / 2, child.getHeight() / 2); mCamera.restore(); return true; } return false; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mTestView.layout(l + MARGIN, t + MARGIN, r - MARGIN, b - MARGIN); } @Override public boolean onTouchEvent(MotionEvent event) { boolean retValue = mGestureDetector.onTouchEvent(event); if (event.getAction() == MotionEvent.ACTION_UP) { mRotaAnim = new RotateAnimationEX(rotateAngle, 180*rotateAngle/Math.abs(rotateAngle), mTestView.getWidth()/2, mTestView.getHeight()/2); mRotaAnim.setFlipListener(this); mRotaAnim.setDuration(700); mRotaAnim.setFillAfter(true); mTestView.startAnimation(mRotaAnim); rotateAngle = 0; } return retValue; } @Override public boolean onDown(MotionEvent e) { if (mTestView != null) mTestView.clearAnimation(); return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { rotateAngle = (e1.getY() - e2.getY()) / getHeight() * MAX_ROTATE_ANGLE; invalidate(); return true; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public void onFlip() { mTestView.setBackgroundColor(COLORS[(++mCurrentColor) % COLORS.length]); } private static int mCurrentColor = 0; private static final int[] COLORS = new int[] {Color.BLUE, Color.RED}; }
使用代码:
package com.ray.demo; import com.ray.animation.TestViewGroup; import android.app.Activity; import android.os.Bundle; public class ChromeEggActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new TestViewGroup(this)); } }
最新技术文章: