0

タイトルからして、この質問は少しややこしく、多くの人を惹きつけます (-) と思いますが、非常に興味深いことがわかるでしょう。

私はiOS用の素敵なアプリをコーディングしており、友人と一緒にAndroidに移植したいと考えています。コードの一部を除いて、すべてがうまくいきました。

私の iOS アプリでは、UIWebview の読み込み中に UIView が表示され、アニメーション化されます。UIWebview の読み込みが終了したら、非表示にします。animateWithDuration関数で作ったアニメーション。ここにいます:

UIView:

@property (nonatomic,retain) IBOutlet UIView *animationLayer;
_animationLayer.hidden=YES;

Viewdidload で初期化する

_animationLayer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    _animationLayer.backgroundColor=[UIColor colorWithRed:(arc4random() % 255)/255.0f green:(arc4random() % 255)/255.0f blue:(arc4random() % 255)/255.0f alpha:1.0f];
    _animationLayer.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);

読み込み時に UIView を表示し、アニメーション化を開始します。

- (void) webViewDidStartLoad:(UIWebView *)webView {
[UIView animateWithDuration:7.0
                      delay:0.0
                    options: UIViewAnimationOptionCurveEaseOut
                 animations:^{ _animationLayer.backgroundColor=[UIColor colorWithRed:(arc4random() % 255)/255.0 green:(arc4random() % 255)/255.0 blue:(arc4random() % 255)/255.0 alpha:1.0f];}
                 completion:nil];
}

ロード完了時に非表示にする

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    _animationLayer.hidden=YES;
}

Androidで作成できると思う方法は次のとおりです。ロード時にカスタマイズされたプログレスバーを表示し、完了すると非表示にします。プログレスバーは、上記の iOS コードのように色が変わるフルスクリーン キャンバスでカスタマイズできます。:(何か提案や簡単な方法はありますか?

ありがとう!

4

3 に答える 3

1

Web 呼び出しが行われている間、バックグラウンドで Android のアニメーションを実行するには、AsyncTask を使用します。このように見えます

   private class WebCallOperation extends AsyncTask<String, Void, String>
        {
            private final ProgressDialog dialog = new ProgressDialog(context);

            @Override
            protected String doInBackground(String... params)
            {

                //web call code here

                //response returned here
                return "";
            }

            @SuppressWarnings("rawtypes")
            @Override
            protected void onPostExecute(String result)
            {
                if (this.dialog.isShowing())
                {
                    this.dialog.dismiss();
                }
            }

            @Override


protected void onPreExecute()
        {
            this.dialog.setMessage("Loading");
            this.dialog.show();
        }
    }

先ほど示したコード例では、ProgressDialog を追加しました。これは通常、Web 呼び出しを行うときに使用するものですが、必要なものに置き換えることができます。独自のビューを追加して、代わりにアニメーション化できます。実行前メソッドでアニメーション化してから、実行後メソッドで Web 呼び出しを終了します。

IOS アプリに関するちょっとしたアドバイス、私はすでにコメントで期間の問題について述べました。また、Web 呼び出しを実行するためのブロック コードを調査する必要があると思います。サンプルコードを提供したい場合は、生活がずっと楽になります

編集:

Objective-C ブロック コード。ここでこのクラスを作成します

インターフェイス クラス

#import <Foundation/Foundation.h>
#import "WebCall.h"

@interface WebCall : NSObject
{
    void(^webCallDidFinish)(NSString *response);

}

@property (nonatomic, retain) NSMutableData *responseData;

-(void)setWebCallDidFinish:(void (^)(NSString *))wcdf;

-(void)webServiceCall :(NSString *)sURL_p : (NSMutableArray *)valueList_p : (NSMutableArray *)keyList_p;

@end

実装クラス

#import "WebCall.h"
#import "AppDelegate.h"
@implementation WebCall

@synthesize responseData;

-(void)setWebCallDidFinish:(void (^)(NSString *))wcdf
{
    webCallDidFinish = [wcdf copy];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    int responseStatusCode = [httpResponse statusCode];

    NSLog(@"Response Code = %i", responseStatusCode);
    if(responseStatusCode < 200 || responseStatusCode > 300)
    {
        webCallDidFinish(@"failure");
    }



    [responseData setLength:0];
}

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{

    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [responseData appendData:data]; 
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{

    NSLog(@"WebCall Error: %@", error);
    webCallDidFinish(@"failure");
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

        NSString *response = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
        response = [response stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        webCallDidFinish(response);

}

-(void)webServiceCall :(NSString *)sURL_p : (NSMutableArray *)valueList_p : (NSMutableArray *)keyList_p
{
    NSMutableString *sPost = [[NSMutableString alloc] init];

    //If any variables need passed in - append them to the POST
    //E.g. if keyList object is username and valueList object is adam will append like
    //http://test.jsp?username=adam
    if([valueList_p count] > 0)
    {
        for(int i = 0; i < [valueList_p count]; i++)
        {
            if(i == 0)
            {
                    [sPost appendFormat:@"%@=%@", [valueList_p objectAtIndex:i],[keyList_p objectAtIndex:i]];
            }
            else
            {

                    [sPost appendFormat:@"&%@=%@", [valueList_p objectAtIndex:i], [keyList_p objectAtIndex:i]];
            }
        }
    }


    NSData * postData = [sPost dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
    NSString * postLength = [NSString stringWithFormat:@"%d",[postData length]];



    NSURL * url = [NSURL URLWithString:sURL_p];
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:5];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

    if (theConnection)
    {
        self.responseData = [NSMutableData data];
    }


}

@end

次に、この Web 呼び出しを行うには、次のように呼び出します

 WebCall *webCall = [[WebCall alloc] init];


    [webCall setWebCallDidFinish:^(NSString *str){

        //This method is called as as soon as the web call is finished
        NSLog(@"%@", str);
    }];


    //Make web call here
    [webCall webServiceCall:@"http://www.bbc.co.uk/" :nil :nil];

setWebCallDidFinish メソッドを参照してください。Web コールが終了するまで呼び出されません。したがって、アニメーションを停止するなど、Web 呼び出しが終了したらすぐにコードを実行する必要がある場合は、そのメソッドで呼び出します。それが役立つことを願っています

于 2013-06-19T15:03:11.820 に答える
0

ObjC2Jを試すことができます。

ObjC2J は、Objective-C (Mac OS X) コードを PC プラットフォーム用の Java に変換するオープンソース ライブラリ ツールです。

于 2013-06-19T14:57:03.750 に答える